J'exécute actuellement une série de fonctions où le premier argument est une variable définie ailleurs et le deuxième argument est une chaîne qui se trouve être identique au nom de la variable:

assignString(Hello, 'Hello')
assignString(World, 'World')
assignString(Foo, 'Foo')
assignString(Bar, 'Bar')
...

Idéalement, je voudrais simplifier ceci en quelque chose comme ceci:

['Hello', 'World', 'Foo', 'Bar'].forEach(() => { assignString... })

or

[Hello, World, Foo, Bar].forEach(() => { assignString... })

Est-ce réellement possible?

1
robinnnnn 6 mars 2016 à 23:15

5 réponses

Meilleure réponse
const vars = { Hello, World, Foo, Bar };
Object.keys(vars).forEach(key => assignString(vars[key], key));
1
madox2 6 mars 2016 à 20:22

Vous pouvez créer un objet avec vos données, parcourir les clés et transmettre la paire clé-valeur à votre fonction assignString.

var data = {
    Hello: Hello,
    World: World,
    Foo: Foo,
    Bar: Bar
}

Object.keys(data).forEach(key => assignString(data[key], key));
-2
Calvin Belden 6 mars 2016 à 20:21

Étant donné que le nom de la variable et la chaîne sont équivalents , il n'est pas nécessaire de les transmettre deux fois. Je préfère passer dans la portée de la variable. Vous pouvez le faire pour que cela fonctionne dans la portée de votre choix:

function assignString(scope, val){
    scope[val] = val;
}

Appelé comme

assignString(window, "Hello");

Sortie de console.log(Hello) ==> "Hello"

0
J. Titus 6 mars 2016 à 20:33

En utilisant le nouvel objet Map ES6, nous pouvons créer des paires nom / valeur dans une structure qui peut ensuite être transformée en tableau, donc forEach peut fonctionner:

  // Variables that assignString will need:
  var Hello = "var1", World = "var2", Foo = "var3", Bar = "var4";

  // Map object that contains name of variables and strings that match variable name
  var m = new Map([[Hello, "Hello"],[World,"World"],[Foo, "Foo"], [Bar, "Bar"]]);

  // Turn Map into Array so forEach will work:
  var a = Array.from(m);

  // Call forEach which calls assingString and passes key name
  // (variable name) and string value
  a.forEach((value) =>  { assignString(value[0], value[1]); });

Voir ce violon: https://jsfiddle.net/qnwsajes/34/

-1
Scott Marcus 6 mars 2016 à 21:26

Je pense que la seule façon de créer dynamiquement des variables basées sur une valeur de chaîne est de faire quelque chose comme ceci:

var exampleStringValue = 'HELLO';
window[exampleStringValue] = exampleStringValue;
console.log(window.HELLO);

// or, since window is the global context in the browser
console.log(HELLO)

Honnêtement, je ne peux pas dire que je peux imaginer un cas d'utilisation où c'est une bonne pratique, mais je ne connais pas votre cas d'utilisation, donc pas de jugement ici :)

Je voudrais également souligner cette petite bibliothèque que j'ai trouvée utile pour créer des objets où les clés ont la même valeur que le nom de la clé: https://github.com/STRML/keyMirror. J'ai trouvé que c'était très utilisé dans la communauté React.

0
thataustin 6 mars 2016 à 20:22