web-dev-qa-db-fra.com

Comment gérer la règle eslint no-param-réaffectation dans les fonctions Array.prototype.reduce ()

J'ai récemment ajouté la règle eslint no-param-reassign .

Cependant, lorsque j'utilise reduce pour construire un objet (objet vide sous la forme initialValue), je me retrouve à devoir modifier le accumulator (premier arg de la fonction de rappel) à chaque itération de rappel, ce qui provoque un no-param-reassign plainte linter (comme on pourrait s'y attendre).

const newObject = ['a', 'b', 'c'].reduce((result, item, index) => {
  result[item] = index; // <-- causes the no-param-reassign complaint
  return result;
}, {});

Y a-t-il une meilleure façon de construire un objet avec reduce qui ne modifie pas l'argument accumulator?

Ou dois-je simplement désactiver la règle de peluchage pour cette ligne dans mes fonctions de rappel reduce?

32
sfletche

Je revisite cette question pour poster une nouvelle réponse qui m'est finalement venue à l'aide de opérateur de propagation d'objet ) ...

const newObject = ['a', 'b', 'c'].reduce((result, item, index) => ({
  ...result,
  [item]: index, 
}), {});
14
sfletche

Eh bien, vous pouvez faire (result, item) => Object.assign({}, result, {[item]: whatever}) Pour créer un nouvel objet à chaque itération :-)

Si vous voulez tromper le linter, vous pouvez utiliser => Object.assign(result, {[item]: whatever}) (qui fait la même chose que votre code actuel mais sans affectation explicite), mais oui, je suppose que vous devez simplement désactiver cette règle.

9
Bergi

Je viens d'envelopper les fonctions de réduction dans un bloc de désactivation de la règle de peluches, à savoir:

/* eslint-disable no-param-reassign */
const newObject = ['a', 'b', 'c'].reduce((result, item, index) => {
  result[item] = index;
  return result;
}, {});
/* eslint-enable no-param-reassign */
0
Zack Knopp