Collections 从ES6 map()函数返回多个值
假设我有这样的东西:Collections 从ES6 map()函数返回多个值,collections,ecmascript-6,flatmap,Collections,Ecmascript 6,Flatmap,假设我有这样的东西: let values = [1,2,3,4]; let newValues = values.map((v) => { return v *v ; }); console.log(newValues); //[1,4,9,16] 非常直截了当 现在,如果我想为每个对象返回多个值,该怎么办 例如 我可以使用reduce函数 let values = [1,2,3,4]; let newValues = values.map((v) => {
let values = [1,2,3,4];
let newValues = values.map((v) => {
return v *v ;
});
console.log(newValues); //[1,4,9,16]
非常直截了当
现在,如果我想为每个对象返回多个值,该怎么办
例如
我可以使用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值=[1,2,3,4];
const newValues=值。reduce((acc,cur)=>{
返回acc.concat([cur*cur,cur*cur*cur,cur+1]);
//或acc.push([cur*cur,cur*cur*cur,cur+1]);返回acc;
}, []);
console.log('newValues=',newValues)
根据定义,.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;
}, []);
如果需要映射阵列并展平结果,可以使用:
const值=[1,2,3,4];
const newValues=values.flatMap((v)=>[v*v,v*v*v,v+1]);
log(JSON.stringify(newValues))//[1,1,2,4,8,3,9,27,4,16,64,5]
更好地使用
输出:[
1.
1.
2.
4.
8.
3.
9,
27,
4.
16,
64,
5.
]您要的是平面图。见@RayToal谢谢。我觉得很多有效的编程方法都是知道正确的术语。linked-为什么不使用
.push()
,而不是每次循环都创建一个新数组?您可以将多个值传递给.push()
。事实上,您实际上也不需要使用.reduce()
for/of
或.forEach()
在.push()
将值放入以前声明的数组中就可以了。@jfriend00因为reduce()
是一种函数式编程方法(我的优先权)。当然,您的解决方案也很好。不喜欢,因为(1)这是非常缓慢的^2-和(2)有一个内置的fn flatMap不需要坏的做法(实现官方功能之外的另一个功能)这很漂亮。非常巧妙地使用了concat
如何处理多个数组参数。TypeError:flatMap不是一个函数。我在节点v10.18.1中遇到此错误。节点v10不支持此错误,但有多填充,您也可以在答案中使用[].concat()
解决方案。
let values = [1,2,3,4];
let result = values.reduce((array, val) => {
array.push(val*val , val*val*val, val+1);
return array;
}, []);
const output = _.flatMap([1,2,3,4], (v, index, arr) => [v *v, v*v*v, v+1])