Array.map 1个元素到多个元素
Array.map 1 element to multiple element
我有[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
因此,与公认的解决方案相比,.push 更可取。
您可以为每个项目生成一个数组,然后连接所有这些数组:
[3, 16, 120].map(x => [x+1, x+2] ).reduce( (acc,val) => acc.concat(val), []);
不是特别好,但这是一个可能的解决方案:
var arr = [3, 16, 120];
console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
使用 Array#concat
和 Array#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#reduce
in combination with Array#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), []));
我自己想出了一个,使用展开运算符。
[].concat(...[3, 16, 120].map(x => [x+1, x+2]))
不可变的解决方案,使用扩展运算符:
[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])
使用Array.prototype.flat():
const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();
console.log(doubled)
公平警告——到目前为止还不是标准方法(12/2018 发布)。
2019 年更新
使用 Array.prototype.flatMap()
,在 ES10 中引入。
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]
我有[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
因此,与公认的解决方案相比,.push 更可取。
您可以为每个项目生成一个数组,然后连接所有这些数组:
[3, 16, 120].map(x => [x+1, x+2] ).reduce( (acc,val) => acc.concat(val), []);
不是特别好,但这是一个可能的解决方案:
var arr = [3, 16, 120];
console.log([].concat.apply([], arr.map(function (n) { return [n+1, n+2]; })));
使用 Array#concat
和 Array#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#reduce
in combination with Array#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), []));
我自己想出了一个,使用展开运算符。
[].concat(...[3, 16, 120].map(x => [x+1, x+2]))
不可变的解决方案,使用扩展运算符:
[3, 16, 120].reduce((a, v) => [...a, v+1, v+2], [])
使用Array.prototype.flat():
const doubled = [3, 16, 120].map(item => [item + 1, item + 2]).flat();
console.log(doubled)
公平警告——到目前为止还不是标准方法(12/2018 发布)。
2019 年更新
使用 Array.prototype.flatMap()
,在 ES10 中引入。
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]