Lors du renvoi d'un objet à partir d'une fonction de flèche, il semble nécessaire d'utiliser un ensemble supplémentaire de {}
et un mot clé return
en raison d'une ambiguïté de la grammaire.
Cela signifie que je ne peux pas écrire p => {foo: "bar"}
, mais je dois écrire p => { return {foo: "bar"}; }
.
Si la fonction flèche renvoie autre chose qu'un objet, les {}
et return
ne sont pas nécessaires, par exemple: p => "foo"
.
p => {foo: "bar"}
renvoie undefined
.
Un p => {"foo": "bar"}
modifié modifie "SyntaxError
: jeton inattendu: ':
'").
Y a-t-il quelque chose d'évident qui me manque?
Vous devez placer le littéral d'objet renvoyé entre parenthèses. Sinon, les accolades seront considérées comme désignant le corps de la fonction. Les oeuvres suivantes:
p => ({ foo: 'bar' });
Vous n'avez pas besoin de mettre une autre expression entre parenthèses:
p => 10;
p => 'foo';
p => true;
p => [1,2,3];
p => null;
p => /^foo$/;
etc.
Référence: MDN - Renvoi des littéraux d'objet
Vous vous demandez peut-être pourquoi la syntaxe est valide (mais ne fonctionne pas comme prévu):
var func = p => { foo: "bar" }
C'est à cause de syntaxe de libellé de JavaScript :
Donc, si vous transcrivez le code ci-dessus en ES5, il devrait ressembler à ceci:
var func = function (p) {
foo:
"bar"; //obviously no return here!
}
Si le corps de la fonction de flèche est entouré d'accolades, il n'est pas renvoyé implicitement. Enveloppez l'objet entre parenthèses. Cela ressemblerait à quelque chose comme ça.
p => ({ foo: 'bar' })
En enveloppant le corps dans des parenthèses, la fonction retournera { foo: 'bar }
.
J'espère que cela résoudra votre problème. Si ce n'est pas le cas, j'ai récemment écrit un article sur les fonctions de flèche qui le décrit plus en détail. J'espère que tu trouves cela utile. Fonctions de la flèche Javascript
const getUser = user => {return { name: user.name, age: user.age };};
const user = { name: "xgqfrms", age: 21 };
console.log(getUser(user));
// {name: "xgqfrms", age: 21}
const getUser = user => ({ name: user.name, age: user.age });
const user = { name: "xgqfrms", age: 21 };
console.log(getUser(user));
// {name: "xgqfrms", age: 21}
La même réponse peut être trouvée ici!
https://github.com/lydiahallie/javascript-questions/issues/22
https://mariusschulz.com/blog/returning-object-literals-from-arrow-functions-in-javascript
Vous pouvez toujours vérifier ceci pour des solutions plus personnalisées:
x => ({}[x.name] = x);