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;i
getByKey=函数(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;
};