我有这个数组,其中每个索引都包含一个对象文字。所有对象字面量都具有相同的属性。对于给定的属性,一些对象文字具有相同的值,我想创建一个包含仅那些对象文字的新数组。
我的想法是对数组进行排序,并将其切片成一个新数组......
这是数组:
var arr = [];
arr[0] =
{
country: "United States",
num: 27
};
arr[1] =
{
country: "Australia",
num: 5
};
arr[2] =
{
country: "United States",
num: 7
};
因此,我想创建一个新数组,其中仅包含那些属性 country
为“United States”的对象。到目前为止,这是我的疯狂想法,但行不通:
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();
最佳答案
"I want to create a new array containing only those objects where the property country is "United States""
这正是 Array.filter()
method 的内容用于:
var filteredArray = arr.filter(function(val, i, a) {
return val.country==="United States";
});
请注意 .filter()
方法在版本 9 之前的 IE 中不可用,但我上面链接的 MDN 页面向您展示了如何实现它,因此阅读该页面本身应该回答你的问题。
另请注意,在问题的(非工作)代码中,您的两个 for
循环基本上彼此做相同的事情,因为它们都在迭代 arr
,所以像这样嵌套它们是没有意义的。你不应该在数组上使用 for..in 循环,但如果你这样做,key
值将是数字索引,它不会以某种方式获取存储在每个位置的对象的属性索引。
编辑:
"Some of the object literals have the same value for a given property, and I want to create a new array containing only those object literals."
好吧,重新阅读这篇文章我猜你并不是真的想通过指定一个国家来选择元素,你想为任何有重复条目的国家选择元素?因此,如果还有另外三个元素都包含“新西兰”,您是否希望在“美国”元素之外选择它们?如果是这样,您可以这样做:
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;
});
关于javascript - 如何从对象文字数组中切片数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10827894/