2016-03-24 13 views
0

ich eine schrecklich lange Konstanten-Datei haben, die etwa wie folgt aussieht:Definieren Sie den Wert einer Konstante oder eine Variable als den Namen der konstanten oder variablen ohne Zuordnung

export const AUTH_REQUEST = 'AUTH_IN_PROGRESS'; 
export const AUTH_SUCCESS = 'AUTH_SUCCESS'; 
export const AUTH_FAIL = 'AUTH_FAIL'; 
export const AUTH_TERMINATE = 'AUTH_TERMINATE'; 
export const AUTH_REDIRECT = 'AUTH_REDIRECT'; 

.... und so auf.

Ist es möglich, eine Variable/Konstante/etc. so zu deklarieren, dass sie denselben Namen wie die Variable selbst hat?

Oder ... gibt es eine Datenstruktur, die so etwas erlaubt?

const AUTH = {'TERMINATE', 'REDIRECT'} ... etc

So würden Sie AUTH.TERMINATE mit einem Wert von TERMINATE haben.

Meine Backup-Lösung ist etwas zu tun: const AUTH = keyObj(['TERMINATE', 'SUCCESS']).

Diese Funktion würde wie folgt aussehen:

let keyObj = (vals)=>{ let obj = {}; vals.forEach((v)=>{ obj[v]=v; }); return obj; }

+0

Warum sammeln Sie sie nicht in einem Objekt? –

+0

Da ist nichts in die Sprache eingebaut, nein. – Pointy

+0

@NinaScholz Das ist, was die Funktion am unteren Rand macht –

Antwort

2

können Sie so etwas wie folgt verwenden:

  1. Cre aß ein Array mit den gewünschten Strings.
  2. Verwenden Sie [].reduce, um ein Objekt zu erstellen, das diese Zeichenfolgen als Eigenschaftsnamen und Werte enthält und ein leeres Objekt als Anfangswert übergibt. [].forEach kann auch funktionieren.
  3. Freeze das Objekt.
var strings = ['a', 'b'], 
    obj = Object.create(null); 
strings.forEach(function(str) { 
    obj[str] = str; 
}); 
Object.freeze(obj); 

Verkleinerungs in einer einzigen Anweisung,

Object.freeze(['a','b'].reduce((o,s) => (o[s]=s, o), Object.create(null))); 
+0

Das ist ziemlich nett. –

+0

Hier ist, was ich am Ende mit: '' 'Let Cests = Funktion() { Rückgabe Object.freeze (Array.from (Argumente). Reduce ((o, s) => (o [s] = s, o) , Object.create (null))); } .bind (null); '' ' –

+0

Die Verwendung von Restargumenten anstelle von' Array.from (Argumente) 'und' .bind (null) 'scheint ein bisschen nutzlos:' let costs = function (... args) {return Object.freeze (args.reduce ((o, s) => (o [s] = s, o), Object.create (null))); } ' – Oriol

2

Sie könnten eine Hilfsfunktion schreiben:

function consts() { 
    return Array.from(arguments).reduce(function(o, c) { 
    o[c] = c; 
    return o; 
    }, {}); 
} 

Dann:

var AUTH = consts("TERMINATE", "REDIRECT"); 

bearbeiten —, wenn Sie es sein unveränderlich wollen, könnten Sie die Eigenschaften stellen Sie sicher sind, dass die Art und Weise erstellt:

function consts() { 
    return Array.from(arguments).reduce(function(o, c) { 
    Object.defineProperty(o, c, { 
     value: c, enumerable: true 
    }); 
    return o; 
    }, {}); 
} 
+0

Das sieht ziemlich gut aus =) –

+0

@CalvinFroedge Beachten Sie, dass 'Array.from()' ES2015 ist, aber es ist super einfach um das zu umgehen. – Pointy

+0

Ja, alles wird sowieso transpiliert. –

0

nicht sicher, ob ich es richtig verstanden habe, aber mit diesem:

const types = ['SUCCESS', 'FAIL', 'TERMINATE']; 
const AUTH = {}; 

for (let type of types) { 
    AUTH[type] = type; 
} 

Sie werden AUTH.TERMINATE erhalten mit einem Wert von String "TERMINATE" usw.

1

Ist es möglich, eine Variable/Konstante/usw. zu erklären, sich den gleichen Namen wie die Variable zu haben?

Wenn Sie im strikten Modus sind (und man könnte sein müssen const zu verwenden), bin ich ziemlich sicher, dass es keine Möglichkeit gibt ist dynamisch den JavaScript-Namespace zu füllen.Welches ist eigentlich das, was du fragst, nein, Entschuldigung. Andere Antworten hier sind das dynamische Hinzufügen von Eigenschaften zu einem Objekt, was völlig in Ordnung ist.

Verwandte Themen