Return 来自 ES6 map() 函数的多个值
Return multiple values from ES6 map() function
假设我有这样的东西:
let values = [1,2,3,4];
let newValues = values.map((v) => {
return v *v ;
});
console.log(newValues); //[1,4,9,16]
非常简单。
现在,如果我想 return 每个对象的多个值怎么办?
例如。
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]
我可以使用 reduce 函数
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()
就可以做到这一点。你不需要 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)
编辑:
更好的方法是使用 flatMap(如@ori-drori 所述):
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()
returns 一个与输入数组长度相同的数组,因此当您想创建不同长度的结果时,这不是一个好的选择。
从效率的角度来看,最好使用 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;
}, []);
如果您需要映射一个数组,并将结果展平,您可以使用 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]
如果 Array.flatMap()
不可用,请使用 Array#concat and the 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]
最好使用 lodash
中的 flatMap
const output = _.flatMap([1,2,3,4], (v, index, arr) => [v *v, v*v*v, v+1])
输出:[
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 ;
});
console.log(newValues); //[1,4,9,16]
非常简单。
现在,如果我想 return 每个对象的多个值怎么办?
例如。
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]
我可以使用 reduce 函数
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()
就可以做到这一点。你不需要 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)
编辑: 更好的方法是使用 flatMap(如@ori-drori 所述):
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()
returns 一个与输入数组长度相同的数组,因此当您想创建不同长度的结果时,这不是一个好的选择。
从效率的角度来看,最好使用 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;
}, []);
如果您需要映射一个数组,并将结果展平,您可以使用 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]
如果 Array.flatMap()
不可用,请使用 Array#concat and the 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]
最好使用 lodash
中的flatMap
const output = _.flatMap([1,2,3,4], (v, index, arr) => [v *v, v*v*v, v+1])
输出:[ 1、 1、 2、 4、 8, 3、 9、 27, 4、 16, 64, 5个 ]