Dis que j'ai quelque chose comme ça:
let values = [1,2,3,4];
let newValues = values.map((v) => {
return v *v ;
});
console.log(newValues); //[1,4,9,16]
Assez simple.
Maintenant, que se passe-t-il si je veux renvoyer plusieurs valeurs pour chacun de mes objets?
par exemple.
let values = [1,2,3,4];
let newValues = values.map((v) => {
return [v *v, v*v*v, v+1] ;
});
console.log(newValues); //This is what I want to get
//[1, 1, 2, 4, 8, 3, 9, 27, 4, 16, 64, 5]
Je peux utiliser une fonction de réduction
let values = [1,2,3,4];
let newValues = values.map((v) => {
return [v *v, v*v*v,v+1] ;
}).reduce((a, c) => {
return a.concat(c);
});
console.log(newValues);
Mais est-ce la meilleure façon de faire cela?
En utilisant un seul reduce()
, vous pouvez le faire. vous n'avez pas besoin de map()
. meilleure approche est la suivante:
const values = [1,2,3,4];
const newValues= values.reduce((acc, cur) => {
return acc.concat([cur*cur , cur*cur*cur, cur+1]);
// or acc.Push([cur*cur , cur*cur*cur, cur+1]); return acc;
}, [])
console.log('newValues =', newValues)
Aplatissez les résultats de la carte en utilisant Array # concat et la syntaxe spread :
const values = [1,2,3,4];
const newValues = [].concat(...values.map((v) => [v *v, v*v*v, v+1]));
console.log(JSON.stringify(newValues)); //[1, 1, 2, 4, 8, 3, 9, 27, 4, 16, 64, 5]
Par définition, .map()
renvoie un tableau de la même longueur que le tableau en entrée. Ce n'est donc pas un bon choix lorsque vous souhaitez créer un résultat de longueur différente.
Du point de vue de l'efficacité, il est probablement préférable d'utiliser for/of
et d'éviter de créer de nombreux tableaux intermédiaires:
let values = [1,2,3,4];
let result = [];
for (let val of values) {
result.Push(val*val , val*val*val, val+1);
}
Si vous souhaitez utiliser efficacement les méthodes de tableau, vous pouvez utiliser .reduce()
avec .Push()
pour éviter de créer un nouveau tableau à chaque itération:
let values = [1,2,3,4];
let result = values.reduce((array, val) => {
array.Push(val*val , val*val*val, val+1);
return array;
}, []);
Mieux utiliser flatMap
de lodash
const output = _.flatMap([1,2,3,4], (v, index, arr) => [v *v, v*v*v, v+1])
résultat: [ 1, 1, 2, 4, 8, 3, 9, 27, 4, 16, 64, 5