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