从ES6 map()函数返回多个值

dwj*_*ton 6 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]
Run Code Online (Sandbox Code Playgroud)

挺直的.

现在,如果我想为每个对象返回多个值,该怎么办?

例如.

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]
Run Code Online (Sandbox Code Playgroud)

我可以使用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); 
Run Code Online (Sandbox Code Playgroud)

但这是最好的方法吗?

Ema*_*ami 10

只使用一个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)
Run Code Online (Sandbox Code Playgroud)

  • @jfriend00因为`reduce()`是一种函数式编程方法(我的优先级).当然,您的解决方案也可以正常工作. (2认同)

Ori*_*ori 7

使用Array#concatspread语法展平地图的结果:

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]
Run Code Online (Sandbox Code Playgroud)

更新:现在,您还可以使用普通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]
Run Code Online (Sandbox Code Playgroud)

  • 其他选择是使用 `.map().flat()` (2认同)

jfr*_*d00 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);
}
Run Code Online (Sandbox Code Playgroud)

如果你想有效地使用数组方法,你可以使用.reduce()with.push()来避免在每次迭代时创建一个新数组:

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

let result = values.reduce((array, val) => {
    array.push(val*val , val*val*val, val+1);
    return array;
}, []);
Run Code Online (Sandbox Code Playgroud)