JavaScript - 内置函数删除对象中的多个键?

时间:2015-09-12 02:34:58

标签: javascript

在JavaScript中,我可以使用

删除对象的密钥

delete myObject[myKey];

有时,我需要删除相当多的键,但不是父键中包含我想要删除的键的所有值。

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

multiDelete myObject[keyOne, keyTwo, keyThree];

7 个答案:

答案 0 :(得分:25)

这是一个类似于你要求的单行。

eventId

答案 1 :(得分: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'}

答案 2 :(得分:2)

没有内置函数,但您可以采用的一种方法是将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 };

DEMO

答案 3 :(得分:2)

您还可以使用对象分解。

const obj = {
        a: 'dog',
        b: 'cat',
        c: 'mouse',
        d: 'cow',
        e: 'horse',
    };
const {a, e, ...updatedObject} = obj;

// output
console.log(updatedObject)

答案 4 :(得分:0)

使用lodash库有一个简单的解决方法。

_。omit函数获取您的对象和要删除的键数组,并返回一个新对象,该对象具有原始对象的所有属性,但数组中未提及。

这是删除键的一种好方法,因为使用它可以获得一个新对象,而原始对象保持不变。这样可以避免发生突变的问题,即如果我们删除了原始对象中的键,则使用该对象的所有其他代码部分可能会倾向于破坏或引入代码中的错误。

示例:

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

//Output
result = {z:3};

相同文档的链接点击Here

答案 5 :(得分:0)

您可以创建键数组以按字符串删除,然后遍历对象以将其删除

var obj = {key1: 1, key2: 2, key3: 3 };

"key1 key2 key3".split(" ").forEach(e => delete obj[e]);

答案 6 :(得分:0)

如果您想要一个内置的解决方案,可以添加一个类似于Object.defineProperties()的实用程序功能,这样既可以向给定对象添加属性,又可以通过传递{{ 1}}属性描述符。

null如果属性描述符不是对象,则会引发错误,因此我们可以安全地使用“ falsy”值来指示要删除该属性。

代码如下:

Object.defineProperties()

该函数的名称应为“(un)define properties”,即“ define or delete properties”。

使用实用程序功能{{1,它会将给定的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; } 分为非正常值的“普通”值和“虚假”值的“待删除”的值}}(在下面的代码段中定义,取自this answer)。

然后,它调用带有从“正常”条目中重建的属性描述符对象的propertyDescriptors

之后(由于第一步可能由于不正确的属性描述符而失败),所有“待删除”条目都将删除partition中的相应属性。

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

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

这是带有用法示例的完整代码:

Object.defineProperties()