删除多个对象属性?

58

我创建了一个有多个属性的对象 -

var objOpts = {
  option1: 'Option1',
  option2: 'Option2',
  option2: 'Option3'
};

后来我又添加了一些属性——

objOpts.option4 = 'Option4'
objOpts.option5 = 'Option5'

我已完成两个属性的创建 ('Option4' & 'Option5'),现在想要清除/删除它们。

目前我会这样做 -

delete objOpts.option4
delete objOpts.option5

还有其他方法可以处理这个问题吗?想象一下,如果我添加了5个属性,并且需要清除/删除它们所有,那将是五行几乎相同的"delete"代码。


5
var extraOpts = ['option4','option5','option6','option7','option8']; for(index in extraOpts){ delete objOpts[extraOpts[index]]; }意为:定义一个字符串数组extraOpts,其中包含五个元素。然后循环遍历extraOpts数组中的每个元素,将每个元素作为属性名,从objOpts对象中删除相应的属性。 - scragar
更好的做法是...var extraOpts = {}; extraOpts.options = ['option4','option5','option6','option7','option8']; delete extraOpts.options; console.log(extraOpts.options); - buycanna.io
第一个答案中有一个小错误:在for循环中缺少'let'。应该是:var extraOpts = ['option4','option5','option6','option7','option8']; for(let index in extraOpts){ delete objOpts[extraOpts[index]]; } - Paul Beloff
8个回答

101

3
非常整洁的答案。唯一的小缺陷是 EsLint 警告 a 和 b 被赋值但从未被使用。 - Aharon Ohayon
@AharonOhayon 可以使用 https://eslint.org/docs/rules/no-unused-vars#ignorerestsiblings 来解决这个问题。 - aarjithn
如果您将解构对象声明为 const,那么这会消除 elist 警告吗? - greaterKing
使用 ESlint 的项目可能会抱怨未使用的变量,因此您可能需要在该特定行之前禁用该规则。 - vsync
一些代码检查规则允许您使用下划线来表示未使用的变量,例如:_var,同时仍然允许您这样声明它:const { _a, _b, ...rest }。否则,您可以将以下内容添加到您的 eslintrc 文件中:"no-unused-vars": ["error", { "varsIgnorePattern": "^_", "argsIgnorePattern": "^_" }],以忽略以下划线开头的未使用变量或参数。我真的很喜欢这个“简洁”的答案,但是像大多数简洁的代码一样,它可能不容易理解。不过,您总是可以将其包装在一个命名函数中,以提高可读性。 - CTS_AE

47

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

_.omit函数接受您的对象和要删除的键的数组,并返回一个新对象,该对象包含原始对象的所有属性,除了数组中提到的那些属性。

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

例如:

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

//Output
result = {z:3};

同样的文档链接 点击这里


14

我相信您正在尝试向对象添加自定义属性。

我建议更简单的方式是创建一个子属性:

objOpts.custom.option4 = 'Option4'
objOpts.custom.option5 = 'Option5'

这样,您可以删除objOpts.custom并完成操作。请注意,在此步骤之后,您将不得不重新创建objOpts.custom = {}

此外,这种方式也更接近面向对象编程,因为您的公共属性很容易与私有属性区分开来。

如果您刚开始学习JavaScript中删除对象,我想指出一篇关于该主题的优秀文章:http://perfectionkills.com/understanding-delete/

您可以尝试使用元属性玩弄它们,这将允许您保护属性免受删除等操作(从而为您的情况创建更好的编码流程)。

编辑:

我想补充说明的是,您可以简单地说objOpts.custom = {},这将释放option4option5等内存(最终通过垃圾回收实现)。


11

一种方法是创建一个单独的函数,该函数将您的对象和属性作为参数。

Js fiddle示例

以下是代码:

var objOpts = {
  option1: 'Option1',
  option2: 'Option2',
  option3: 'Option3',
  option4: 'Option4'
};

/** 
 * Method for removing object properties
 *
 */
var removeObjectProperties = function(obj, props) {

    for(var i = 0; i < props.length; i++) {
        if(obj.hasOwnProperty(props[i])) {
            delete obj[props[i]];
        }
    }

};

// remove
removeObjectProperties(objOpts, ["option1", "option2"]);

// objOpts - after
console.log(objOpts);

2
不需要检查 obj.hasOwnProperty(props[i]),因为 delete 不需要该属性存在。 - YetAnotherFrank
@mauno-vähä,对象没有LENGTH属性,我想是这样的。 - Aberel

8
比Mauno Vänä更现代的方法:
function deleteProps (obj, prop) {
    for (const p of prop) {
       delete obj[p];
    }    
}

例子:

// Create sample object
const myObject = {
    a: 'Foo',
    b: 'Baa',
    c: 'Baz'
};

// Prints: {a: "Foo", b: "Baa", c: "Baz"}
console.log(myObject);

// Delete props
deleteProps(myObject, ['a', 'b']);

// Prints: {c: "Baz"}
console.log(myObject);

3
不需要检查(p in obj),因为delete不要求该属性存在。 - YetAnotherFrank

0
var obj = {"key1":1,"key2":2,"key3":3,"key4":4};

if (!('multidelete' in Object.prototype)) {
Object.defineProperty(Object.prototype, 'multidelete', {
    value: function () {
        for (var i = 0; i < arguments.length; i++) {
            delete this[arguments[i]];
        }
    }
});
}

obj.multidelete("key1","key3");

你可以像这样使用它来删除对象中的多个键。

0

另一个选择是使用Object.assign将属性设置为nullundefined,具体取决于您的用例。这不会删除属性,而是清除它们。因此,您可以执行以下任一操作:

// Modify the object directly
Object.assign(objOpts, {option4: null, option5: null});

或者

// Create a copy of the object with the properties cleared 
const newObject = Object.assign({}, objOpts, {option4: null, option5: null});

你也可以使用数组来列出要清除的属性,使用Array.reduce()创建Object.assign()的最后一个参数。


-1
Object.keys(object).forEach((prop) => delete object[prop]);

这与delete object有何不同? - buycanna.io
你不能在一个对象上调用 deletedelete 可以用来删除对象的属性,而不是对象本身。 - shaahiin
这如何允许删除特定属性而不是所有属性? - Erhhung
2
这似乎是一个解决方案,可以删除对象的所有属性,使您得到 object === {}。但这并没有回答 OP 的问题。 - flyingace

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