在 JavaScript 中从对象中不可变地删除属性数组的最优雅方法是什么?

What is the most elegant way to remove an array of properties from an object immutably in JavaScript?

不确定我是否试图以一种优雅的方式在这里完成太多,但假设我有一个对象如下:

const obj = { foo: 'bar', prop: 'str', hi: 'hello' };

然后我有一组要从该对象中删除的属性:

const keys = ['prop', 'hi'];

我正在寻找可以不变地获得以下输出的最佳方法:

{ foo: 'bar' }

我正在研究使用解构赋值,但我无法弄清楚如何使它与属性数组一起工作,除非它具有静态长度:

({ [keys[0]]: value, [keys[1]]: value, ...output }) = o;

也许有另一种方法可以执行上述行但使用映射?

谢谢!

您可以迭代数组并使用 delete 删除每个匹配的键。

要复制您拥有的对象,您可以使用展开运算符

const keys = ['prop', 'hi'];
const obj = { foo: 'bar', prop: 'str', hi: 'hello' };
const newobj={...obj}
keys.forEach(o=> delete newobj[o])
console.log(obj)
console.log(newobj)
这是另一种使用 Object.fromEntriesfiltersome

的方法

const keys = ['prop', 'hi'];
const obj = { foo: 'bar', prop: 'str', hi: 'hello' };
res=Object.fromEntries(Object.entries(obj).filter(o=>!keys.some(k=>o[0]==k)))
console.log(res)
console.log(obj)

我会结合使用 Object.fromEntriesObject.entries 和数组 .filter 方法。那么这个操作就变得相当简单了:

function removeKeysFromObj(obj, keys) {
  return Object.fromEntries(Object.entries(obj).filter(([key]) => !keys.includes(key)));
}

const obj = { foo: 'bar', prop: 'str', hi: 'hello' };
const keys = ['prop', 'hi'];

const newObj = removeKeysFromObj(obj, keys);

console.log("New object:", newObj);

// And note the original is unmodified:
console.log("Original object:", obj);

解决这个问题的一种方法是以相反的方式思考:映射原始对象中的键并保留不在列表中的键:

function removeKeys(obj, keys) {
    return Object.keys(obj)
        .filter(k => !keys.includes(k))
        .reduce((newObj, k) => {
            newObj[k] = obj[k];
            return newObj
        }, {});

我会这样做。

const obj = { foo: 'bar', prop: 'str', hi: 'hello' };
const keys = ['prop', 'hi'];
let result = Object.keys(obj).reduce((current, item) => (keys.includes(item) || (current[item] = obj[item]), current), {});
console.log(result);