如何使用其他对象属性值定义对象键?

时间:2015-04-10 11:36:04

标签: javascript

我有一个对象,我想使用对象属性值作为键(简化):

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属性值定义属性名称?

3 个答案:

答案 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了解更多详情。