Javascript 如何从对象文字数组中分割数组?
我有一个数组,其中每个索引包含一个对象文本。所有对象文字都具有相同的属性。对于给定的属性,某些对象文字具有相同的值,我想创建一个仅包含这些对象文字的新数组。Javascript 如何从对象文字数组中分割数组?,javascript,arrays,sorting,slice,object-literal,Javascript,Arrays,Sorting,Slice,Object Literal,我有一个数组,其中每个索引包含一个对象文本。所有对象文字都具有相同的属性。对于给定的属性,某些对象文字具有相同的值,我想创建一个仅包含这些对象文字的新数组。 我的想法是对数组进行排序,并将其分割成一个新数组。。。 这是数组: var arr = []; arr[0] = { country: "United States", num: 27 }; arr[1] = { country: "Australia", num: 5 }; arr[2] = {
我的想法是对数组进行排序,并将其分割成一个新数组。。。
这是数组:
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();
函数getNewArray(arr)
{
var arr2=[];
for(arr中的var键)
{
对于(变量i=0;igetByKey=函数(arr、键、值){
var结果=[];
对于(变量i=0;i
这里有一个有效的例子
以下是我的解决方案:
// 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]);
}
}
//假设已经设置了arr
var num_obj=阵列长度;
var obj_按国家={},obj;
对于(变量i=0;i1){
最终数组推送(按国家/地区[i]);
}
}
有一种更简单的方法,我想这就是你想要的
var new\u arr=arr.filter(函数(obj){return obj['country']=='United';})
这将把你的结果过滤到新的数组中
当然,你可以让它比“美国”更好、更通用
编辑:
哎呀,刚才有你的问题吗
答:嵌套筛选器:)
我想创建一个新数组,该数组只包含属性国家为“美国”的对象
这正是本书的目的:
请注意,.filter()
方法在9版之前的IE中不可用,但我上面链接的MDN页面向您展示了具体的实现方法,因此阅读该页面本身应该可以回答您的问题
还请注意,在问题中的(非工作)代码中,您的两个for
循环基本上是在做相同的事情,因为它们都在arr
上迭代,所以这样嵌套它们是没有意义的。您不应该在数组上使用for..in循环,但如果使用键,则值将是数字索引,它不会以某种方式获取存储在每个索引处的对象的属性
编辑:
某些对象文字对于给定属性具有相同的值,我想创建一个仅包含这些对象文字的新数组
好的,重读这篇文章,我想你不是真的想通过指定一个国家来选择元素,你想为任何有重复条目的国家选择元素?那么,如果还有另外三个元素都有“新西兰”,那么除了“美国”元素之外,你还会选择它们吗?如果是这样,您可以这样做:
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 countryCount={},
我
对于(i=0;i1;
});
您能使用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);
});
var getCountry=函数(国家){
var out=[];
对于(变量i=0,len=arr.length;i
演示:如果你要使用jQuery,为什么不使用?感谢nnnnnn和@iting_sh提供的jQuery选项——这两个选项都是我想要的,并且是跨浏览器兼容的。我最终可能会使用这样的jQuery算法,但前面的答案帮助我解决了我的逻辑。我没有投反对票,但是t这行不通。我想你的意思是if(arr[I][key]==value)
,你可能打算按arr[I]
。目前,您的代码在循环中从未使用过i
。谢谢,有点匆忙,修复了它。这一个与elclanrs
的解决方案非常相似,因为它简单有效。但是,这稍微复杂一些,因为有两个额外的参数key
和value
,我没有nk在大多数情况下我都需要。你能澄清你的问题吗:你用“美国”做例子吗听起来好像你想指定一个国家,只返回该国家的元素,但你的第一段似乎说结果应该包括任何有重复的国家。有些答案是单向的,有些是反向的(我刚刚更新了答案以涵盖这两个)。也许您可以将示例数组更新为包含两个以上的国家/地区?对不起,我实际上是在尝试返回一个只包含匹配值的数组。最近,我发现我需要这样一种算法,从一个数组返回多个数组,每个数组只包含指定的匹配值。这太棒了,一个我会完全使用这个想法,除了我的代码需要与IE的所有版本兼容,其中.filter()
不是很不幸(IE很糟糕!)。Thx:)那条评论让我很开心这是一段很好的代码,非常简单!这正是我需要的,这让我走上了正确的道路。。然而,现在我很困惑,不知道到底哪个国家可能是,也可能不是
var filteredArray = arr.filter(function(val, i, a) {
return val.country==="United States";
});
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 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);
});
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;
};