2 votes

Une manière élégante de transformer certains noms de propriétés dans une carte de tableaux

Supposons que...

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];

Je sais que je peux transformer ce tableau en un nouveau tableau en prenant et en renommant le tableau y un bien comme celui-ci...

A.map(o => ({ v: o.y }));
// [{ v:'y' }, { v:'y' }]

Et je peux utiliser un étalement pour obtenir toutes les propriétés existantes plus une nouvelle, transformée comme ceci...

A.map(o => ({ ...o, ...{ v: o.y } }));
// [{ x:'x', y:'y', v:'y' }, { x:'x', y:'y', v:'y' }]

Mais je me demande s'il n'existe pas un moyen élégant de renommer simplement le fichier y à la propriété v . Voici donc ce que je veux.

// [{ x:'x', v:'y' }, { x:'x', v:'y' }]

Je sais que je peux utiliser un bloc de fonction sur ma fonction fat arrow, ajouter un v et supprimer la propriété y mais c'est une procédure lourde. Je cherche quelque chose d'élégant.

4voto

amrender singh Points 5081

Vous pouvez utiliser Array.map() et Object destructing :

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];

let result = A.map(({y,...rest})=> ({...rest,v:y}));

console.log(result);

3voto

Nina Scholz Points 17120

Vous pouvez renommer la propriété et utiliser la syntaxe restante pour un objet afin d'obtenir toutes les autres propriétés. Pour le mappage, prenez les paramètres reposés et la nouvelle propriété.

let A = [{ x: 'x', y: 'y' }, { x: 'x', y: 'y' }];

console.log(A.map(({ y: v, ...o }) => ({ ...o, v })));

1voto

Mark Meyer Points 31911

Je sais que tu as dit que tu savais que tu pouvais delete Il n'est pas nécessaire d'être inélégant si l'on cherche à modifier les objets en place :

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];

A.forEach(o => delete Object.assign(o, {v: o.y }).y)
console.log(A)

0voto

Ele Points 22769

Cette approche permet de réduire le nombre de codé en dur de convertir les clés en nouvelles clés. D'autre part, cette [mapping[k]] est appelé Computed property names .

De même, la fonction Array.prototype.reduce construit l'objet désiré conformément à la mapping et l'objet spécifique lui-même.

Important : _La fonction Array.prototype.map crée un nouveau tableau, mais ne modifie pas le tableau d'origine._

let A = [{ x:'x', y:'y' }, { x:'x', y:'y' }];
    mapping = {'y': 'v'},    
    result = A.map(o => Object.keys(o).reduce((a, k) => {
      if (k in mapping) return Object.assign(a, {[mapping[k]]: o[k]});
      return Object.assign(a, {[k]: o[k]});
    }, Object.create(null)));

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X