2017-02-27 3 views
0

Ich habe den folgenden CodeReiniger Methode Variablen in ES6 zuweisen

const lower = U => U.toLowerCase(); 

const A = lower('A') 
const B = lower('B') 
const C = lower('C') 
const D = lower('D') 
... 

Wie vertrete ich dies ein sauberer Weg? Es ist garantiert, dass der Variablenname und der Parameter, die an die Funktion übergeben werden, gleich sind.

Eine mögliche Lösung, die ich denken konnte, ist

const [ A, B, C, D ] = ['A', 'B', 'C', 'D'].map(lower) 

Gibt es eine Lösung ohne diese Vervielfältigung?

+0

Also, versuchen Sie, alle Kleinbuchstaben auf elegante Weise zu bekommen? –

+0

Warum gibt es ein Problem? Was ist los mit der aktuellen Implementierung? – Li357

+1

Warum brauchen Sie die Variablen trotzdem? Kannst du nicht einfach weiterketteln und tun, was du brauchst? Dynamische Variablen sind nicht gut ... – elclanrs

Antwort

1

Sie könnten ein Objekt mit den früheren Variablennamen als Schlüssel verwenden. Es ist leicht zu pflegen und zu iterieren.

const lower = U => U.toLowerCase(), 
 
     object = {}; 
 

 
['A', 'B', 'C', 'D'].forEach(c => object[c] = lower(c)); 
 

 
console.log(object);

Bei gegebenen Werten innerhalb des Objekts

const lower = U => U.toLowerCase(), 
 
     object = { A: 'A', B: 'B', C: 'C', D: 'D' }; 
 

 
Object.keys(object).forEach(k => object[k] = lower(object[k])); 
 

 
console.log(object);

-1

Dies ist ein für mich "sehr" interessante Frage zu sein, hat sich herausgestellt und es half Ich verstehe etwas tiefer in JavaScript (nicht vollständig). OK lange Geschichte kurz, die Sie tun können, wie folgt;

var f = String.prototype.toLowerCase, 
 
    r = []; 
 

 
r = ["A", "B", "C", "D"].map(f.call,f); 
 
console.log(r);

Hier bieten wir den this als String.prototype.toLowerCase Funktion selbst. Dies ist jedoch ein wenig (oder nicht leicht) eine knifflige Angelegenheit.

Wenn Sie versuchen, die Callback-Funktion .map() isoliert von der .map() durch die gleichen Argumente zu übergeben, funktioniert alles gut wie folgt;

var c = String.prototype.toLowerCase.call("A",0,["A", "B", "C", "D"]); 
 
console.log(c); // <- "a";

Wenn Sie jedoch genau die gleiche Funktion in einem .map() gilt es eine „Uncaught Typeerror: nicht definiert ist keine Funktion“ werfen Fehler wie folgt;

r = ["A", "B", "C", "D"].map(String.prototype.toLowerCase.call);

Hmm ... scheint wie in .map() wir this als String.prototype.toLowerCase Funktion Objekt selbst zur Verfügung stellen müssen. Warum so ..? Ehrlich schlägt mich. Kann jemand sein kann helfen ...

+1

Warum? Weil 'call', wie jede andere Methode, nur eine ungebundene Funktion ist, wenn Sie sie übergeben. – Bergi

+0

@Bergi Great .. Nur nicht anders als 'r = [" A "," B "," C "," D "]. Map (Function.call, String.prototype.toLowerCase);' Danke. – Redu