如何从JavaScript对象中移除一个键?

1840

假设我们有一个这样格式的对象:

var thisIsObject= {
   'Cow' : 'Moo',
   'Cat' : 'Meow',
   'Dog' : 'Bark'
};

我想要创建一个根据键名删除元素的函数:

removeFromObjectByKey('Cow');

4
你想让这个函数成为一个jQuery函数,还是说这与jQuery有什么关系? - dst
27
实际上那是一个 JavaScript 对象,在 JavaScript 中并不存在关联数组。 - alex
3
是的,我认为只是术语上有些混淆,例如它是JavaScript而不是Jquery,并且它是一个对象而不是数组(OP可能来自使用关联数组的其他语言)。 - thomasrutter
3个回答

3109
delete操作符允许您从一个对象中删除属性。
下面的例子都是做同样的事情。
// Example 1
var key = "Cow";
delete thisIsObject[key]; 

// Example 2
delete thisIsObject["Cow"];

// Example 3
delete thisIsObject.Cow;

let animals = {
  'Cow': 'Moo',
  'Cat': 'Meow',
  'Dog': 'Bark'
};

delete animals.Cow;
delete animals['Dog'];

console.log(animals);

如果您感兴趣,可以阅读“理解Delete”来深入了解。

60
如果你正在遍历一个对象的键,并删除与某个值匹配的键,那么在循环过程中是否会影响键的索引? - CMaury
11
请注意,IE8在某些情况下使用 delete 时可能会抛出异常。请参见 https://dev59.com/hnNA5IYBdhLWcg3wI6V4 - nullability
4
有人知道这个操作的运行时间吗? - Ozymandias
4
在我十年的JS开发经验中,不论是在大公司还是小公司,我从未需要过这个功能或知道它的存在。感谢您,亲切的先生,发表了这篇文章。 - Randy Hall
4
如果您的代码检查工具提示您不应该使用 delete 关键字,请使用以下语句:Reflect.deleteProperty(object1, 'property1'); - Ben174
显示剩余7条评论

288
如果你正在使用Underscore.js或Lodash,那么有一个名为“omit”的函数可以实现此功能。
http://underscorejs.org/#omit
var thisIsObject= {
    'Cow' : 'Moo',
    'Cat' : 'Meow',
    'Dog' : 'Bark'
};
_.omit(thisIsObject,'Cow'); //It will return a new object

=> {'Cat' : 'Meow', 'Dog' : 'Bark'}  //result
如果您想修改当前对象,请将返回的对象赋值给当前对象。
thisIsObject = _.omit(thisIsObject,'Cow');

使用纯JavaScript,可以使用:

delete thisIsObject['Cow'];

使用纯JavaScript的另一种选项。

thisIsObject = Object.keys(thisIsObject).filter(key =>
    key !== 'cow').reduce((obj, key) =>
    {
        obj[key] = thisIsObject[key];
        return obj;
    }, {}
);

41
被踩了。问题在于在Underscore和Lodash中,_.omit返回一个新的对象,而不是修改当前对象。因此,这有些不同。 - shabunc
11
纯 JavaScript 也是一样的。delete o.properrty 在幕后所做的事情比带来好处更多,因为它会改变 o 的隐藏类并使其成为一个通用的慢对象。 - Mateusz Nowak
6
object.property = undefined是合法的。完美运行!(获得了点赞) - tonejac
82
赞同。在许多情况下,新的不可变对象更为优选。 - Dominic
5
抱歉给您点了反对票,但这句话“thisIsObject.cow = undefined;”非常具有误导性。即使这样做,Object.keys(thisIsObject)仍然会列出'cow'。因此它并没有真正被删除。 - Patrik Beck
显示剩余8条评论

174

就像这样简单:

delete object.keyname;
或者
delete object["keyname"];

6
如果这个键是一个自动生成的数字,并且我们不知道它是否存在,我们可以进行以下操作: const unknownKey = 100500; delete object[\${unknownKey}`]; 其中unknownKey是一个代表未知键的数字,通过使用delete` 关键字来从对象中删除该键。 - Sergii
9
这个答案与第一个答案有何不同? - Afzal Ali

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