枚举对象作为字典键

10
我希望使用所谓的 "枚举" 对象作为字典键(实际上,据我所知,它也是一个字典),在 JavaScript 中。
这样不起作用:
    var State ={DEFAULT:0,ACTIVE:1 ,INACTIVE:2,ALERT:3};

    var statesDict =  {
      State.ACTIVE : {color:0x00ff00}
      State.INACTIVE: {color:0x000000}
    };

而这一个则做到了:

   var State ={DEFAULT:0,ACTIVE:1 ,INACTIVE:2,ALERT:3};

    var statesDict =  {
      1: {color:0x00ff00}
      2: {color:0x000000}
    };

为什么?难道 State.{prop name} 不应该被替换为其值吗?


1
var statesDict = { [State.ACTIVE]: {color:0x00ff00}, ... }。您不能在没有括号的情况下替换属性名称变量。 - Heretic Monkey
@RokoC.Buljan 不需要在对象字面量中使用引号来创建属性名称... - Heretic Monkey
快速提示:您只能使用字符串作为字典键,除了符号之外的任何其他内容都将通过toString函数进行转换。 - schroffl
@RokoC.Buljan 我更喜欢将非字符串的东西保留为非字符串 )) - Michael IV
1个回答

15

你可以使用带有方括号的计算属性名

var State = { DEFAULT: 0, ACTIVE: 1, INACTIVE: 2, ALERT: 3 },
    statesDict = {
        [State.ACTIVE]: { color: 0x00ff00 },
        [State.INACTIVE]: { color: 0x000000 }
    };

console.log(statesDict);


根据输出结果,我看到键现在是一个字符串。这是Js处理类型的方式吗?我不能将键保留为整数吗?或者说在Js中"类型"没有意义?)) - Michael IV
可以。在这里,您正在尝试将某些表达式评估为数字。通常情况下,数字可以作为键。 (它们将被转换为字符串) - Attersson
1
所有对象的键,包括数组的索引都是字符串。 - Nina Scholz
@NinaScholz 很好,感谢您的澄清。Js 是一种奇怪的语言。 - Michael IV
1
@MichaelIV: JS现在有一个Symbol类型,如果可以使用ES6,那么它会更好。当作为对象属性使用时,它们不会被转换为字符串。 { DEFAULT: Symbol(), ACTIVE: Symbol(), INACTIVE: Symbol(), ALERT: Symbol() } 它还有一个Map类型,可以用于您的statesDict,所以您可以执行statesDict.get(State.ACTIVE)) - user2437417

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接