如何从对象文本数组中切片数组
How do I slice an array from an array of object literals?
我有这个数组,其中每个索引都包含一个对象文字。所有对象文本都具有相同的属性。对于给定属性,某些对象文本具有相同的值,我想创建一个仅包含这些对象文本的新数组。
我的想法是对数组进行排序,并将其切成一个新数组......
这是数组:
var arr = [];
arr[0] =
{
country: "United States",
num: 27
};
arr[1] =
{
country: "Australia",
num: 5
};
arr[2] =
{
country: "United States",
num: 7
};
因此,我想创建一个新数组,仅包含属性country
为"美国"的对象。到目前为止,这是我的疯狂想法,它不起作用:
function getNewArray(arr)
{
var arr2 = [];
for(var key in arr)
{
for(var i = 0; i < arr.length - 1; i++)
{
if(arr.hasOwnProperty(key) && arr[i].name == arr[i + 1].name)
{
arr2[i] = arr.slice(key);
}
}
}
return arr2;
}
var arr3 = getNewArray(arr).sort();
"我想创建一个新数组,仅包含属性国家/地区为"美国"的对象"
这正是Array.filter()
方法的用途:
var filteredArray = arr.filter(function(val, i, a) {
return val.country==="United States";
});
请注意,.filter()
方法在版本 9 之前的 IE 中不可用,但我上面链接到的 MDN 页面向您展示了如何实现它,因此阅读该页面本身应该回答您的问题。
另请注意,在问题中的(非工作)代码中,您的两个for
循环基本上彼此做同样的事情,因为它们都在迭代arr
,因此像这样嵌套它们是没有意义的。你不应该使用 for..在数组上循环,但如果你这样做,key
值将是数字索引,它不会以某种方式获取存储在每个索引上的对象的属性。
编辑:
"对于给定属性,某些对象文本具有相同的值,我想创建一个仅包含这些对象文本的新数组。
好的,重读这篇文章,我猜你真的不想通过指定一个国家来选择元素,你想为任何有重复条目的国家选择元素?因此,如果还有另外三个元素都有"新西兰",除了"美国"元素之外,您还想选择它们吗?如果是这样,您可以执行以下操作:
var countryCount = {},
i;
for (i = 0; i < arr.length; i++)
if (countryCount.hasOwnProperty(arr[i].country)
countryCount[arr[i].country]++;
else
countryCount[arr[i].country] = 1;
var filteredArr = arr.filter(function(val, i, a) {
return countryCount[val.country] > 1;
});
var getCountry = function (country) {
var out = [];
for (var i = 0, len = arr.length; i < len; i++)
if (arr[i].country === country) out.push(arr[i]);
return out;
};
演示:http://jsfiddle.net/YwytD/1/
有一种更简单的方法可以做到这一点,我认为这就是你想要的 var new_arr = arr.filter(function(obj){ return obj['country'] === 'United States'; })
这会将您的结果过滤为new_arr当然,你可以让它比"美国"更好、更通用
编辑:哎呀,刚才有你的问题了
答:嵌套筛选器:)
function getKeyStuff(key) {
return arr.filter( function(obj) {
var new_arr = arr.filter( function(inner_obj) {
return inner_obj[key] === obj[key];
});
return new_arr.length > 1;
});
}
这是我的解决方案:
// assuming arr is already set
var num_obj = arr.length;
var obj_by_country = {}, obj;
for (var i = 0; i < num_obj; i++) {
obj = arr[i];
if (!obj_by_country[obj.country]) {
obj_by_country[obj.country] = [];
}
obj_by_country[obj.country].push(obj);
}
// build final array
var final_array = [];
for (i in obj_by_country) {
if (obj_by_country[i].length > 1) {
final_array.push(obj_by_country[i]);
}
}
你能用JQuery吗?
var arr = [];
arr[0] = { country: "United States", num: 27 };
arr[1] = { country: "Australia", num: 5 };
arr[2] = { country: "United States", num: 7 };
var newArray = [];
$.each(arr, function(){
if(this.country == "United States")
newArray.push(this);
});
getByKey = function(arr, key, value) {
var results = [];
for(var i = 0; i < arr.length; i++) {
if(arr[i][key] === value) {
results.push(arr[i]);
}
}
return results
}
这是一个工作示例http://jsfiddle.net/michaelghayes/UyHYz/2/
- 对不同的数组进行切片并返回选定的值
- 如何在jquery中对php/ajax传递的数组进行切片
- Ramda.js - 切片数组的内部值
- JavaScript 中的最大公共数组切片
- 切片和拼接不适用于数组值
- 我如何在数组中存储值 从切片获取
- 如何从对象文本数组中切片数组
- 无法通过在节点.js中切片来修改数组
- 使用对象对数组进行切片,并获取包含对象副本的数组
- 未引用的数组在“切片”之后不那么未引用
- JavaScript 数组切片与删除
- 如何在数组中轻松添加“.”,可以使用切片
- 用键数组对JSON对象数组进行切片
- handlers.js模板,带有用于切片数据数组的自定义助手
- 复制带切片的数组时出现异常行为
- 从数组(切片)中提取x个项目,但如果到达末尾,则从头开始继续
- 数组.切片不起作用,它只是原样复制数组,而不是减去一些值
- 多维数组切片多个HTML表和导航d3.js
- 排序javascript数组切片
- 为什么数组切片将javascript参数转换为数组