【问题标题】:Using constants as indices for JavaScript associative arrays使用常量作为 JavaScript 关联数组的索引
【发布时间】:2011-05-06 06:09:59
【问题描述】:

我希望在 JavaScript 中创建一个关联数组,但使用定义为类的一部分的常量作为索引。

我想要这样做的原因是,该类的用户可以使用常量(定义事件)来触发操作。

一些代码来说明:

STATE_NORMAL = 0;
STATE_NEW_TASK_ADDED = 0;
this.curr_state = STATE_NEW_TASK_ADDED;

this.state_machine = {
    /* Prototype:
    STATE_NAME: {
        EVENT_NAME: {
            "next_state": new_state_name,
            "action": func
        }
    }
    */

    STATE_NEW_TASK_ADDED : { // I'd like this to be a constant
        this.EVENT_NEW_TASK_ADDED_AJAX : {
            "next_state": STATE_NEW_TASK_ADDED,
            "action" : function() {console.log("new task added");},
        }
    }
}

// Public data members.
// These define the various events that can happen.
this.EVENT_NEW_TASK_ADDED_AJAX = 0;
this.EVENT_NEW_TASK_ADDED_AJAX = 1;

我无法让它工作。我对 JavaScript 不太熟悉,但看起来无论我做什么,数组都是用字符串而不是常量定义的。有没有办法强制数组使用常量?

【问题讨论】:

    标签: javascript constants associative-array


    【解决方案1】:

    在 ECMAScript 6 中,您可以为对象键使用计算值:

    var CONSTANT_A = 0, CONSTANT_B = 1
    var state_machine = {
        [CONSTANT_A]: function () {
            return 'a'
        },
        [CONSTANT_B]: function () {
            return 'b'
        }
    };
    
    console.log(state_machine)

    这在 Internet Explorer 11 和 Safari 浏览器中都不起作用: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

    【讨论】:

    • 谢谢!你为我节省了很多时间。
    • 啊,ES6 太棒了
    【解决方案2】:

    请参阅 Kristian's answer re: ECMAScript 6/modern JavaScript,它具有使这成为可能的新语法。

    以下是我的原始答案,来自前现代时代。


    实际上,这里的问题是,当您字面意思定义对象时,您不能为关键部分使用值。

    也就是说,这按预期使用了常量值:

    var CONSTANT_A = 0, CONSTANT_B = 1;
    var state_machine = {};
    state_machine[CONSTANT_A] = "A";
    state_machine[CONSTANT_B] = "B";
    console.log(state_machine[0]); // => A
    console.log(state_machine[1]); // => B

    但这不会按预期工作,而是使用字符串 CONSTANT_A 作为键:

    var CONSTANT_A = 0, CONSTANT_B = 1;
    var state_machine = {
        CONSTANT_A: "A",
        CONSTANT_B: "B",
    };
    console.log(state_machine[0]); // => undefined
    console.log(state_machine["CONSTANT_A"]); // => A
    console.log(state_machine.CONSTANT_A); // => A

    JavaScript 有一个速记来定义对象字面量,您可以在其中省略键周围的双引号。无法使用表达式,因此不会计算 CONSTANT_A

    【讨论】:

      【解决方案3】:

      假设您有以下常量:

      const COMPANIES = "companies";
      const BRANCHES = "branches";
      const QUEUES = "queues";
      const LOGOUT = "logout";
      

      如果你这样声明字典:

      var itemsToState = {
        COMPANIES: true,
        BRANCHES: false,
        QUEUES: false,
        LOGOUT: false,
      }
      
      // You will get:
      // { COMPANIES: true, BRANCHES: false, QUEUES: false, LOGOUT: false }
      

      注意键是大写的^,因为它没有使用常量的值。

      如果你想使用常量的值作为键,你需要这样做:

      var itemsToState = {
        [COMPANIES]: true,
        [BRANCHES]: false,
        [QUEUES]: false,
        [LOGOUT]: false,
      }
      
      // You will get:
      // { companies: true, branches: false, queues: false, logout: false }
      

      注意键是小写的^,因为它使用的是常量的值。

      【讨论】:

      • 示例使代码和答案易于理解。谢谢!
      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 2012-05-08
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多