如何从JavaScript对象中删除密钥?

Mar*_*gco 1171 javascript

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

var thisIsObject= {
   'Cow' : 'Moo',
   'Cat' : 'Meow',
   'Dog' : 'Bark'
};
Run Code Online (Sandbox Code Playgroud)

我想做一个按键删除的功能:

removeFromObjectByKey('Cow');
Run Code Online (Sandbox Code Playgroud)

jes*_*vin 2036

delete运营商允许你删除对象的一个属性.

以下示例都做同样的事情.

// Example 1
var key = "Cow";
delete thisIsObject[key]; 

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

// Example 3
delete thisIsObject.Cow;
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,请阅读了解删除以获得深入的解释.

  • 如果要循环对象中的键,并在它们匹配某个值时将其删除,那么在循环它时这是否会影响键索引? (29认同)
  • 在我看来,使用`for(对象中的var键)`运行该对象仍将匹配该键,并且尝试在循环中使用`object [key]`将引发错误.(或返回`undefined`) (10认同)
  • 请注意,在某些情况下使用`delete`时IE8可能会抛出异常.请参阅http://stackoverflow.com/questions/1073414/deleting-a-window-property-in-ie (7认同)
  • 如果你的linter抱怨使用delete关键字,请使用:`Reflect.deleteProperty(object1, 'property1');` (5认同)
  • 除了它在数组中留下一个未定义,这使得迭代很困难. (4认同)
  • 有谁知道这个操作的运行时间? (3认同)
  • 在以大大小小的职位为重点的JS开发的10年中,我从来没有曾经需要这个或者知道它存在.谢谢,亲切的先生,这篇文章. (3认同)
  • 如果您需要以非常优化的方式执行此操作,例如当您在循环中操作大量对象时,另一个选择是将属性设置为“undefined”。由于其性质,`delete` 的性能比简单地重新分配到 `undefined` 慢很多,慢了 50 倍以上,请参阅 https://jsperf.com/delete-vs-undefined-vs-null/16 使用`delete` 仍然非常快,只有在有充分理由的情况下才应该研究此类性能问题,否则总是首选具有更清晰的语义和功能。 (2认同)

Moh*_*eer 150

如果您使用的是Underscore.js或Lodash,则会有一个"省略"功能.
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
Run Code Online (Sandbox Code Playgroud)

如果要修改当前对象,请将返回对象分配给当前对象.

thisIsObject = _.omit(thisIsObject,'Cow');
Run Code Online (Sandbox Code Playgroud)

使用纯JavaScript,使用:

delete thisIsObject['Cow'];
Run Code Online (Sandbox Code Playgroud)

纯JavaScript的另一种选择.

thisIsObject.cow = undefined;

thisIsObject = JSON.parse(JSON.stringify(thisIsObject ));
Run Code Online (Sandbox Code Playgroud)

  • Upvoted.在许多情况下,新的不可变对象是优选的. (37认同)
  • Downvoted.问题是下划线和lodash _.omit都返回新对象,不会修改当前的对象.所以,这有点不同. (23认同)
  • @shabunc和纯javascript一样.`delete o.properrty`在幕后做了很多弊大于利,因为它改变了`o`的隐藏类并使它成为一个通用的慢对象. (5认同)
  • object.property = undefined是合法的.工作得很完美!(upvoted) (4认同)
  • 我对否决感到抱歉,但是 thisIsObject.cow = undefined; 非常具有误导性。Object.keys(thisIsObject) 仍然会选择“cow”。所以它并没有真正被删除。 (2认同)
  • 分配给“undefined”与“delete”不同 (2认同)

小智 77

它很简单:

delete object.keyname;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案与第一个答案有何不同? (3认同)
  • 如果密钥是生成的数字,并且我们不知道它是否存在,我们可以执行下一步:`constknownKey = 100500;``delete object[\`${unknownKey}\`];` (2认同)