2010-11-07 8 views
9

Ich bin auf der Suche nach einem assoziativen Array in JS, aber verwenden Sie Konstanten als Teil der Klasse definiert als Indizes.Verwendung von Konstanten als Indizes für Javascript Assoziative Arrays

Der Grund dafür ist, dass Benutzer der Klasse die Konstanten (die Ereignisse definieren) zum Auslösen von Aktionen verwenden können.

Einige Code zu veranschaulichen:

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; 

Ich habe Probleme diese immer zu arbeiten. Ich bin nicht zu großartig mit JS, aber es sieht aus wie egal, was ich mache, wird das Array mit Strings und nicht Konstanten definiert. Gibt es eine Möglichkeit, das Array zu zwingen, die Konstanten zu verwenden?

Danke!

Antwort

30

Das Problem ist hier, eigentlich ist, dass Sie keinen Wert für den Schlüsselteil verwenden, wenn Sie buchstäblich ein Objekt sind zu definieren.

Das heißt, können Sie sagen:

var CONSTANT_A = 0, CONSTANT_B = 1, CONSTANT_C = 2; 
var state_machine = {}; 
state_machine[CONSTANT_A] = { ... }; 
state_machine[CONSTANT_B] = { ... }; 

Aber man kann nicht sagen:

var CONSTANT_A = 0, CONSTANT_B = 1, CONSTANT_C = 2; 
var state_machine = { CONSTANT_A: ..., CONSTANT_B: ... }; 

JavaScript können Sie eine „Kurzschrift“ verwenden Objektliterale wo Sie definieren kann die doppelten Anführungszeichen um Schlüssel weglassen. Daher können Sie dort keinen Ausdruck verwenden.

16

In ES6 können Sie berechnete Werte für Objektschlüssel verwenden.

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

 
console.log(state_machine)

Dies funktioniert nicht in IE 11 noch in Safari-Browser: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

+0

Dank! Du hast mir viel Zeit gespart. – Mihir

+0

Ah, ES6 ist so toll –

Verwandte Themen