Array.将一个元素映射到多个元素

Array.map 1 element to multiple element

本文关键字:元素 映射 一个 Array      更新时间:2023-09-26

我有[3, 16, 120]。当我做[3, 16, 120].map(mapper)时,我想要实现,例如[4,5, 17,18, 121,122],即每个元素映射到n+1和n+2。这当然是一个例子——我想要的是简单地从映射器函数推送多个值

我是否必须使用Array.each并推送到一个数组,或者是否可以使用Array.map(或其他内置api)

您可以使用reduce()并将每个元素的e+1, e+2添加到数组中。

var ar = [3, 16, 120];
var result = ar.reduce(function(r, e) {
  r.push(e+1, e+2);
  return r;
}, []);
console.log(result)

这是带有箭头功能的ES6版本

var ar = [3, 16, 120];
var result = ar.reduce((r, e) => r.push(e+1, e+2) && r, []);
console.log(result)

PS:Array.push似乎更快,并且没有Maximum call stack..错误,如下所示:

a = Array(1000000).fill(1); st = Date.now(); Array.prototype.concat.apply([], a.map(function (n) { return [n+1, n+2]; })); console.log(`${Date.now() - st}ms `);
> RangeError: Maximum call stack size exceeded
a = Array(1000000).fill(1); st = Date.now(); a.reduce((r, e) => r.push(e+1, e+2) && r, []); console.log(`${Date.now() - st}ms `);
> 180ms

因此,与公认的解决方案相比,推送更可取。

2019更新

使用ES10中介绍的Array.prototype.flatMap()

const oddNumbers = [1, 3, 5, 7, 9];
const allNumbers = oddNumbers.flatMap((number) => [number, number + 1]);
console.log(allNumbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我自己用排列运算符想出了一个。

[].concat(...[3, 16, 120].map(x => [x+1, x+2]))

不是特别好,但这是一个可能的解决方案:

var arr = [3, 16, 120];
console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));

您可以为每个项目生成一个数组,然后连接所有这些数组:

[3, 16, 120].map(x => [x+1, x+2] ).reduce( (acc,val) => acc.concat(val), []);

您可以将Array#reduceArray#concat结合使用。

console.log([3, 16, 120].reduce(function (r, a) {
    return r.concat(a + 1, a + 2);
}, []));

ES6

console.log([3, 16, 120].reduce((r, a) => r.concat(a + 1, a + 2), []));

不可变解决方案,带有排列运算符:

[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])

使用Array#concatArray#map

Array.prototype.concat.apply([], [3, 16, 120].map(x => [x+1, x+2] ));

只是为了好玩,一个带有生成器的ES6解决方案:

var arr = [3, 16, 120];
var [...result] = (function*() { for( i of arr){ yield ++i; yield ++i; }})();
console.log(result);

使用Array.prototype.flat():

const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();
console.log(doubled)

公平警告-迄今为止不是标准方法(发布于2018年12月)。