我有一个对象,我想使用对象属性值作为键(简化):
var App = function() {
this.settings = {
'tetris': {
title: 'Tetris'
},
'galaxian': {
title: 'Galaxian'
}
};
this.gameName = 'tetris';
this.request = {
this.settings[this.gameName].title: 'THIS KEY IS INVALID' // :(
}
};
我知道我可以将分配为:
this.request[ this.settings[this.gameName].title ] = 'Valid...';
但我想知道我是否可以使用object属性值定义属性名称?
答案 0 :(得分:2)
我很害怕,你的意思是不可能的。您可以不将变量用作对象文字中的键,如下所示:
var key = "somekey";
var obj = {key: "value"}
上面的代码将生成一个具有键key
。
您只能使用变量来定义像这样的对象元素:
var key = "somekey";
var obj = {};
obj[key] = "value"
然后对象得到一个带有键somekey
编辑:如评论中所述,在ECMAScript 6中引入了对对象文字中计算属性的支持。但是,对象文字中计算属性的浏览器支持非常小(您可以在语法 - >对象文字下查找here)。例如,IE 11不支持它,Chrome 43也没有。
答案 1 :(得分:1)
您无法使用计算属性名称定义文字对象;你必须分配它们。
换句话说,如果属性名称众所周知,您可以使用{...}
表示法定义文字对象,或者如果属性名称是x[prop] = v
符号,则可以使用var obj = {
wellKnownPropertyName = 'value';
};
var value = obj.wellKnownPropertyName;
表示法将值分配给地图中的键。计算。
将您的JS对象视为对象或地图,但不是两者。如果JS对象具有众所周知的属性名称,那么它就是一个对象:
var map = {};
var key = getUnknownKeyFromSomewhere();
map[key] = 'value';
var value = map[key];
但是如果计算了属性名称,那么它实际上并不是对象的属性,而是更像是地图中的键,应该如此分配(和读取):
{{1}}
答案 2 :(得分:1)
计算属性名称将在ECMAScript第6版中引入,它们位于current draft,您可以这样做:
this.request = {
[this.settings[this.gameName].title]: 'THIS KEY IS INVALID' // :)
}
他们现在得到了相当好的支持,请参阅MDN了解更多详情。