次のようなものがあるとしましょう:
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);
しかし、これが最善の方法ですか?
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)
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]
_
定義により、.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;
}, []);
_
lodash のflatMap
をより適切に使用する
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]