web-dev-qa-db-ja.com

ES6 map()関数から複数の値を返します

次のようなものがあるとしましょう:

let values = [1,2,3,4]; 

let newValues = values.map((v) => {
  return v *v ; 
}); 

console.log(newValues); //[1,4,9,16]

かなり簡単です。

オブジェクトごとに複数の値を返したい場合はどうすればいいですか?

例えば。

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]

リデュース機能を使用できます

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); 

しかし、これが最善の方法ですか?

6
dwjohnston

reduce()を1つだけ使用すると、これを行うことができます。 map()は必要ありません。より良いアプローチはこれです:

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)
10
Emad Emami

Array#concat および spread syntax を使用して、マップの結果をフラット化します。

_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]_

更新:最近では、Vanilla JSの Array.flatMap()

_const values = [1,2,3,4]; 

const newValues = values.flatMap((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]_
8
Ori Drori

定義により、.map()は入力配列と同じ長さの配列を返すため、異なる長さの結果を作成する場合には適切な選択ではありません。

効率の観点からは、おそらく_for/of_を使用し、多くの中間配列を作成しないようにすることが最善です。

_let values = [1,2,3,4];

let result = [];
for (let val of values) {
    result.Push(val*val , val*val*val, val+1);
}
_

配列メソッドを効率的に使用したい場合は、.reduce().Push()とともに使用して、繰り返しごとに新しい配列を作成しないようにすることができます。

_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

lodashflatMapをより適切に使用する

 const output = _.flatMap([1,2,3,4], (v, index, arr) => [v *v, v*v*v, v+1])

出力:[1、1、2、4、8、8、3、9、27、4、16、64、5]

0
Eesa