11

我想这类似于数组填充,但我想知道它是否可以简化。

var arr = [1,2,3],
    x   = 5;

for (var i=0; i<x; i++) {
  arr.push(x);
}

console.log(arr);
//=> [1, 2, 3, 5, 5, 5, 5, 5]

有没有办法在不使用 for 循环的情况下做到这一点?


更新

即使有更聪明的解决方案,for 循环似乎是最高效的

数组填充 2 jsperf 上的基准测试

4

4 回答 4

10

除非您为编写的每一行代码而受到惩罚,否则该代码很好:简洁且易于理解。

如果您确实受到处罚,请使用:

for (var i = 0; i < x; i++) arr.push(x);

在一行:-)

除此之外,您最好的选择是以下功能:

arr = appendXCopiesOfX (arr, x);

但我认为你在那里并没有真正获得任何东西,因为如前所述,理解这么小的循环应该没有什么问题。

总而言之,试图改进你目前拥有的东西可能是浪费时间和精力。

于 2014-03-19T01:46:29.210 回答
5

没有for循环:

var arr = [1,2,3], x   = 5;
arr = arr.concat(Array.apply(null, Array(x)).map(function() { return x; }));

// or even
arr = arr.concat(Array.apply(null, Array(x)).map(x.valueOf, x));
于 2014-03-19T01:50:47.967 回答
3

对于那些使用 ES6 并遇到过这个问题的人。尝试使用 Array.fill() https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

我在测试中使用此方法为 x 行生成模拟数据,而无需循环。

编辑:对不起,我对这个不感兴趣。此代码将生成一个 x 长的数组,但它们都将具有相同的值。更好的代码片段在这篇文章的末尾。

newOrdersX: function(x) {
  return Array(x).fill({
    name: faker.random.name()
  });
}`

这将是一个 x 级长的数组,但每个值都会不同。请注意,.fill()仍然需要调用它,否则它将不起作用。

newOrdersX: function(x) {
  return Array(x).fill().map(() => ({
    name: faker.random.name()
  }));
}`
于 2017-03-24T03:48:25.180 回答
0

另一个 ES6 选项是用于Array.from()创建一个长度为原始数组 + 的数组x

const pad = (arr, x) => 
  Array.from({ length: arr.length + x }, (_, i) => arr[i] ?? x)

const arr = [1,2,3], x = 5;

console.log(pad(arr, x));

于 2022-01-14T03:53:16.873 回答