使用所需键值列表过滤对象数组

时间:2015-10-30 14:42:00

标签: javascript

我有一个可能如下所示的对象数组:

var arr = [{
  a: 1,
  b: 321,
  c: 556,
  d: 8
}, {
  a: 1,
  b: 22,
  c: 21,
  d: 8
}, {
  a: 1,
  b: 1,
  c: 43,
  d: 8
}, ];

和另一个可能的列表:

var list = ['a', 'c', 'd'];

由于我的列表只有键a,c和d,我想摆脱原始数组上b键的所有实例。所有这些程序都必须是动态的,因为在接收它们之前我无法知道这些键可能是什么。

在JavaScript中有这么好的方法吗?

3 个答案:

答案 0 :(得分:1)

考虑使用underscore.js库。它包含一个reject方法,可以解决这个问题

  

拒绝 _.reject(list, predicate, [context])   返回列表中的值,而不返回真值测试(谓词)传递的元素。与过滤器相反。

     

var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });

     

=> [1, 3, 5]

答案 1 :(得分:1)

arr.forEach(function(element)
{
    for(var key in element)
    {
        if(list.indexOf(key) === -1)
        {
            delete element[key];
        }
    }
});

应该是不言自明的。

如果您不想修改原始数组:

arr.map(function(element)
{
    element = JSON.parse(JSON.stringify(element));
    for(var key in element)
    {

        if(list.indexOf(key) === -1)
        {
            delete element[key];
        }
    }
    return element;
});

答案 2 :(得分:0)

这就是你要找的东西吗?

for(var i=0, i < arr.length; i++) {
  if(arr[i].b) delete arr[i].b
}

//更新,一种香草的方法

var reject = [ "b" ];
for(var i=0, i < arr.length; i++) {
  for(var j in arr[i]) {
    if(reject.indexOf(j) != -1) delete arr[i][j];
  }
}