在一个对象中删除多个键的内置函数

JavaScript - Built in Function to Delete Multiple Keys in an Object?

本文关键字:内置 函数 一个对象 删除      更新时间:2023-09-26

在JavaScript中,我可以使用

删除对象的键

delete myObject[myKey];

是否有一种有效的方法来删除多个键使用一行?看起来像:

multiDelete myObject[keyOne, keyTwo, keyThree];

下面是与您请求的内容类似的一行代码:

var obj = {a: 1, b: 2, c: 3, d: 4, e: 5 };
['c', 'e'].forEach(e => delete obj[e]);
// obj is now {a:1, b:2, d:4}

你也可以使用对象解构。

const obj = {
        a: 'dog',
        b: 'cat',
        c: 'mouse',
        d: 'cow',
        e: 'horse',
    };
const {a, e, ...updatedObject} = obj;
// output
console.log(updatedObject)

有一个使用lodash库的简单修复方法。

_。省略函数接受你的对象和一个你想要删除的键数组,并返回一个新对象,它具有原对象的所有属性,除了数组中提到的那些属性。

这是一种删除键的简洁方式,因为使用它可以获得一个新对象,而原始对象保持不变。这避免了突变的问题,如果我们删除了原始对象中的键,那么使用该对象的代码的所有其他部分可能会有中断或在代码中引入错误的倾向。

的例子:

var obj = {x:1, y:2, z:3};
var result = _.omit(obj, ['x','y']);
console.log(result);
//Output
result = {z:3};

相同文档的链接点击这里

没有内置的js函数来删除多个键,您可以使用任何库,如underscore.js来做到这一点。

_.omit({name: 'moe', age: 50, userid: 'moe1'}, 'userid');
=> {name: 'moe', age: 50}
//or you can use function to filter keys 
_.omit({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object){
  return _.isNumber(value);
});
=> {name: 'moe', userid: 'moe1'}

没有内置函数,但是您可以这样做的一种方法是将multidelete方法添加到Object原型中。这可能有点过分,但你可能会发现它很有用。

if (!('multidelete' in Object.prototype)) {
    Object.defineProperty(Object.prototype, 'multidelete', {
        value: function () {
            for (var i = 0; i < arguments.length; i++) {
                delete this[arguments[i]];
            }
        }
    });
}
var obj = { a: 1, b: 2, c: 3, d: 4, e: 5 };
obj.multidelete('c', 'e'); // { a: 1, b: 2, d: 4 };
演示

如果您想要一个内置的解决方案,您可以添加一个像Object.defineProperties()一样的实用程序函数,这样您可以向给定对象添加属性,但现在也可以通过提交null属性描述符来删除属性。

如果属性描述符不是对象,

Object.defineProperties()将抛出错误,因此我们可以安全地使用&;值,表示要删除该属性。

代码如下:

function unDefineProperties(obj, propertyDescriptors) {
  const [normalDescriptors, toBeDeletedDescriptors] =
    partition(Object.entries(propertyDescriptors),([_, descriptor]) => descriptor);
  Object.defineProperties(obj, Object.fromEntries(normalDescriptors));
  toBeDeletedDescriptors.forEach(([name, _]) => delete obj[name]);
  return obj;
}

函数名应该读作"(un)define properties",即"定义或删除属性"。

它将给定的propertyDescriptors拆分为"normal"那些没有"假的"的;值和"要删除"的值。那些带有"虚假"字样的;值,使用实用函数partition(在下面的代码片段中定义,借用了这个答案)。

然后调用Object.defineProperties(),并使用一个从"normal"重新构造的属性描述符对象。条目。

之后(因为第一步可能由于不正确的属性描述符而失败),所有要删除的"条目删除obj中相应的属性。

最后返回obj,以模仿Object.defineProperties()的方便行为。

结果函数与原始Object.defineProperties()兼容(当然,除了" false "的行为)属性描述符),因此可以用作原始函数的替代品。如果您想这样做,为了保持一致性,您还应该用处理" false "的类似函数替换Object.defineProperty()(单数!)属性描述符,通过删除相应的属性(留给读者作为练习;-))。

下面是完整的代码和使用示例:

const partition = (array, filter) =>
    array.reduce(([pass, fail], e, i) =>
        ((filter(e, i, array) ? pass : fail).push(e), [pass, fail]),
        [[], []]);
function unDefineProperties(obj, propertyDescriptors) {
  const [normalDescriptors, toBeDeletedDescriptors] =
    partition(Object.entries(propertyDescriptors),([_, descriptor]) => descriptor);
  Object.defineProperties(obj, Object.fromEntries(normalDescriptors));
  toBeDeletedDescriptors.forEach(([name, _]) => delete obj[name]);
  return obj;
}
// Usage example:
const obj = { a: 'A', b: 'B', c: 'C'};
unDefineProperties(obj, {
  a: null,
  c: null,
  d: { value: "D", enumerable: true }
});
console.log(obj); // logs { "b": "B", "d": "D" }

您可以创建一个键数组,通过一个字符串来删除它们,并遍历该对象来删除它们

var obj = {key1: 1, key2: 2, key3: 3 };
"key1 key2 key3".split(" ").forEach(e => delete obj[e]);

我找到了另一个解决方案,使用循环通过Object.entries(),这可能是有用的:

var array = {1:'a',2:'b',3:'c',4:'d'};
for (var [key, char] of Object.entries(array)) {
   delete array[key];
}