Javascript - 检查密钥是否存在 - 如果不创建密钥,则全部在一行中

Kin*_*rog 21 javascript

我正在寻找一种检查密钥是否存在以及是否不创建密钥的单行方式.

var myObject = {};

//Anyway to do the following in a simpler fashion?

if (!('myKey' in myObject))
{
    myObject['myKey'] = {};
}
Run Code Online (Sandbox Code Playgroud)

und*_*ned 23

短路评估:

!('myKey' in myObject) && (myObject.myKey = {})
Run Code Online (Sandbox Code Playgroud)

  • 当然,您可以使用 *or* 来删除字符;`('myKey' in myObject) || (myObject.myKey={})` (9认同)
  • 请注意,继承的属性也会被这个拿起来.如果不需要,应该使用hasOwnProperty. (3认同)

Mou*_*faS 11

myObject['myKey'] = myObject['myKey'] || {};
Run Code Online (Sandbox Code Playgroud)

  • 虽然在某些情况下不是问题,但对于"虚假"值(`0`,`undefined`,`null`,`false`,`''等),你将覆盖`myKey` (7认同)

小智 9

您可以使用逻辑空赋值 (??=)

var test = {};
(test.hello ??= {}).world ??= "Hello doesn't exist!";
Run Code Online (Sandbox Code Playgroud)


Bot*_*Net 5

评论:我通常更喜欢@Nindaff@MoustafaS提供的答案,具体取决于具体情况.

为了完整性,您可以使用Object.assign任何不存在的键创建键/值.当您具有要使用的默认选项/设置时,这非常有用,但允许用户通过参数覆盖.它看起来像这样:

var myObject = {};
myObject = Object.assign( { 'myKey':{} }, myObject );
Run Code Online (Sandbox Code Playgroud)

这是同样的东西,输出更多:

var obj = {};
console.log( 'initialized:', obj);


obj = Object.assign( {'foo':'one'}, obj );
console.log( 'foo did not exist:', obj );

obj = Object.assign( {'foo':'two'}, obj );
console.log( 'foo already exists:', obj );


delete obj.foo;
obj = Object.assign( {'foo':'two'}, obj );
console.log( 'foo did not exist:', obj );
Run Code Online (Sandbox Code Playgroud)

注意:IE中没有Object.assign,但有一个Polyfill