Javascript -检查键是否存在-如果不创建它,都在一行中



我正在寻找一个单行的方式来检查一个键是否存在,如果它不创建它。

var myObject = {};
//Anyway to do the following in a simpler fashion?
if (!('myKey' in myObject))
{
    myObject['myKey'] = {};
}

短路评定:

!('myKey' in myObject) && (myObject.myKey = {})
myObject['myKey'] = myObject['myKey'] || {};

评论:根据具体情况,我通常更喜欢@Nindaff和@MoustafaS提供的答案。

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

var myObject = {};
myObject = Object.assign( { 'myKey':{} }, myObject );

下面是相同的内容,只是输出多了一点:

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 );

注意:对象。assign在IE中不可用,但有一个Polyfill

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

var test = {};
(test.hello ??= {}).world ??= "Hello doesn't exist!";

如果您想获取某个键的值,则为该键插入一个新的默认值,如果不存在并返回该默认值,那么您只需一行:

> x = {}
{}
> x['k']
undefined
> x['k'] ?? (x['k'] = 23) // Insert default value for non-existent key
23
> x['k']
23
> x['z'] = 5
5
> x['z'] ?? (x['z'] = 42) // Will not insert default value because key exists
5

使用新的空赋值操作符,可以简化为:

x['k'] ??= 23

显然,您需要为可以映射到null的键添加一些额外的工作

您可以使用hasOwnProperty或typeof来检查退出或不定义…

有一个指定的适合此任务的Proxy内部类型:

const myObj = new Proxy({}, {
  get (target, key) {
    return target.hasOwnProperty(key) && target[key] || (target[key] = {});
  }
});
typeof myObj.foo === 'object' && (myObj.bar.quux = 'norf') && myObj.bar.quux === 'norf';

您可以使用Object.keys(), Object.hasOwnProperty()

var key = {myKey:{}}, prop = Object.keys(key).pop(), myObject = {}; if (!myObject.hasOwnProperty(prop)) {myObject[prop] = key[prop]}
console.log(myObject)

JavaScript ES9 (ECMAScript 2018)引入扩展运算符:

myObject={myKey: {}, ...myObject}

myKey如果不存在将被创建,如果存在则不会被覆盖。例如:

let obj = {a:1,b:2}
let test1 = {...obj,a:3} // == {a:3,b:2}
let test1 = {a:1,b:2,a:3} // == {a:3,b:2}
let test2 = {a:3,...obj} // == {a:1,b:2}
let test2 = {a:3,a:1,b:2} // == {a:1,b:2}

如果你不知道对象的键是否存在你可以这样做

object.key = (object.key || default value) operation

例子
const user = {};
user.stat = (user.stat || 0) + 1; // 1

如果你多次调用这个表达式,你会得到预期的行为

例子
const user = {};
user.stat = (user.stat || 0) + 1; // 1
user.stat = (user.stat || 0) + 1; // 2
user.stat = (user.stat || 0) + 1; // 3

使用三元操作符的效果是一样的

user.stat = user.stat ? user.stat + 1 : 0;

但更紧凑

相关内容

最新更新