我想这类似于数组填充,但我想知道它是否可以简化。
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 循环似乎是最高效的
我想这类似于数组填充,但我想知道它是否可以简化。
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 循环似乎是最高效的
除非您为编写的每一行代码而受到惩罚,否则该代码很好:简洁且易于理解。
如果您确实受到处罚,请使用:
for (var i = 0; i < x; i++) arr.push(x);
在一行:-)
除此之外,您最好的选择是以下功能:
arr = appendXCopiesOfX (arr, x);
但我认为你在那里并没有真正获得任何东西,因为如前所述,理解这么小的循环应该没有什么问题。
总而言之,试图改进你目前拥有的东西可能是浪费时间和精力。
没有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));
对于那些使用 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()
}));
}`
另一个 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));