2010-11-07 7 views
9

Je cherche à créer un tableau associatif dans JS, mais j'utilise des constantes définies comme faisant partie de la classe en tant qu'index.Utilisation de constantes comme indices pour les tableaux associatifs Javascript

La raison pour laquelle je le souhaite est que les utilisateurs de la classe peuvent utiliser les constantes (qui définissent les événements) pour déclencher des actions.

code pour illustrer:

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; 

Je vais avoir du mal à obtenir que cela fonctionne. Je ne suis pas très bon avec JS, mais il semble que peu importe ce que je fais, le tableau est défini avec des chaînes et non des constantes. Est-il possible de forcer le tableau à utiliser les constantes?

Merci!

Répondre

30

Le problème ici, en fait, est que vous ne pouvez pas utiliser une valeur pour la partie clé lorsque vous définissez un objet littéralement.

C'est-à-dire, vous pouvez dire ceci:

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

Mais vous ne pouvez pas dire:

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

JavaScript vous permet d'utiliser un « raccourci » pour définir littéraux d'objet où vous peut omettre les guillemets autour des clés. En tant que tel, vous ne pouvez pas utiliser une expression là-bas.

16

Dans ES6, vous pouvez utiliser des valeurs calculées pour les clés d'objet.

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

 
console.log(state_machine)

Cela ne fonctionne pas dans IE 11, ni dans les navigateurs Safari: https://kangax.github.io/compat-table/es6/#test-object_literal_extensions_computed_properties

+0

Merci! Tu m'as sauvé beaucoup de temps. – Mihir

+0

Ah, ES6 est tellement génial –

Questions connexes