在JavaScript中,从对象中删除不在数组中的键

5
假设我有一个包含许多键的对象列表,并且我想仅保留其中某些键。 以下是我的实现方法。
其他参考 Stack Overflow 的优秀解决方案存在一个问题,即如果某个键未包含在需要保留的键中,则仍会添加该键和值(undefined)。
let data = [{
   'a': 1,
   'b': 2,
   'c': 3
 }, 
 {
   'a': 1,
   'c': 3,
   'd': 4
 }]

const keys_to_keep = ['a', 'b']

data = data.map((obj) => {
  Object.keys(obj).forEach(function(key) {
    if(!keys_to_keep.includes(key))
      delete obj[key]
  });
  return obj;
})

输出:

[ { a: 1, b: 2 }, { a: 1} ]

有没有更好的方法来完成这个任务,非常感谢您的帮助。


4
你目前的做法存在哪些问题? - Pointy
预期输出是什么? - epascarello
https://dev59.com/_7Lma4cB1Zd3GeqPWilP - epascarello
1
如果您已经在使用lodash,请参见https://dev59.com/kF0a5IYBdhLWcg3wFlRH - jarmod
@epascarello 您可以在您分享的SO链接上运行我的数据。它给了我 [ { a: 1, b: 2 }, { a: 1, b: undefined } ],而我想要 [ { a: 1, b: 2 }, { a: 1} ]。这正是我所解释的。 - Akshay Hazari
@jarmod 我可以使用 Lodash 并运行 forEach 循环而不是 includes。你的意思是这样吗?问题完全不同。我现在不知何故收到了该消息的通知,可能是 Stack Overflow 出了问题。这是一个一个月前的问题。对此我感到很抱歉。 - Akshay Hazari
2个回答

9

有几个改进点。

  1. 您正在使用创建新数组的 .map() 方法,但是然后您只是将其分配给了旧变量。因此,您似乎根本不需要创建新数组,只需迭代您拥有的那个数组并修改它即可。

  2. 将要保留的属性放入 Set 中,而不是放入 Array 中,以便更快地查找。

  3. 通常喜欢使用 for/of 循环,而不是 .forEach() 循环,因为它具有更好的流控制选项(中断、继续、返回等)和更多编译器优化的机会。

let kv = [{
   'a': 1,
   'b': 2,
   'c': 3
 }, 
 {
   'a': 1,
   'b': 2,
   'c': 3,
   'd': 4
 }]

const l = new Set(['a', 'b']);

for (let obj of kv) {
    for (let prop of Object.keys(obj)) {
       if (!l.has(prop)) {
           delete obj[prop];
       }
    }
}

console.log(kv);


3

你可以在mapfilter之后使用Object.fromEntries,只保留相关的键:

let data = [{'a': 1,'b': 2,'c': 3},{'a': 1,'c': 3,'d': 4}]
const keys_to_keep = ['a', 'b']

var result = data.map(obj =>
    Object.fromEntries(keys_to_keep.map(key => 
        obj.hasOwnProperty(key) && [key, obj[key]]
    ).filter(Boolean))
);

console.log(result);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接