web-dev-qa-db-fra.com

Renvoie plusieurs valeurs de la fonction ES6 map ()

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? 

4
dwjohnston

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)

7
Emad Emami

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]

3
Ori Drori

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;
}, []);
3
jfriend00

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

0
essaji