我正在寻找一个单行的方式来检查一个键是否存在,如果它不创建它。
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;
但更紧凑