使用所需键值的列表筛选对象数组

Filter array of objects using a list of desired key values

本文关键字:列表 筛选 对象 数组 键值      更新时间:2023-09-26

我有一个对象数组,可能看起来像这样:

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中有没有一种干净的方法可以做到这一点?

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

考虑使用underscore.js库。它包含一个拒绝方法,应该做技巧

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

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

=> [1, 3, 5]

这就是您想要的吗?

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