如何从对象文字数组中切片数组?

时间:2012-05-31 05:27:30

标签: javascript arrays sorting slice object-literal

我有这个数组,其中每个索引都包含一个对象文字。所有对象文字都具有相同的属性。某些对象文字对于给定属性具有相同的值,我想创建一个包含这些对象文字的新数组。

我的想法是对数组进行排序,并将其切成新的数组...

这是阵列:

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();

6 个答案:

答案 0 :(得分:3)

  

“我想创建一个新数组,其中只包含属性国家为”美国“的对象

这正是Array.filter() method的用途:

var filteredArray = arr.filter(function(val, i, a) {
                                  return val.country==="United States";
                    });

请注意,版本9之前的IE中没有.filter()方法,但我上面链接的MDN页面向您显示了如何实现它,因此阅读该页面本身应该回答您的问题。

另请注意,在问题中的(非工作)代码中,您的两个for循环基本上是相同的,因为它们都在arr上进行迭代,所以它将它们嵌套起来是没有意义的。您不应该在数组上使用for..in循环,但如果您执行key值将是数字索引,它不会以某种方式获取存储在每个索引处的对象的属性。 / p>

编辑:

  

“某些对象文字对于给定的属性具有相同的值,我想创建一个只包含那些对象文字的新数组。”

好的,重读这个我猜你真的不想通过指定国家来选择元素,你想为任何有重复条目的国家选择元素吗?那么,如果还有另外三个元素都有“新西兰”,那么你想要选择加上到“美国”吗?如果是这样,你可以这样做:

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;
                  });

答案 1 :(得分:2)

有一种更简单的方法,我认为这就是你想要的 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; 
    });
}

答案 2 :(得分:2)

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/

答案 3 :(得分: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]);
  }
}

答案 4 :(得分:1)

你能使用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);
});

答案 5 :(得分:0)

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/