在JavaScript中创建任意长度的零填充数组最有效的方法是什么?
当前回答
function makeArrayOf(value, length) {
var arr = [], i = length;
while (i--) {
arr[i] = value;
}
return arr;
}
makeArrayOf(0, 5); // [0, 0, 0, 0, 0]
makeArrayOf('x', 3); // ['x', 'x', 'x']
注意while通常比in、forEach等更有效。
其他回答
我正在测试T.J.Crowder的出色答案,并提出了一个基于concat解决方案的递归合并方案,该方案在他的Chrome测试中表现出色(我没有测试其他浏览器)。
function makeRec(len, acc) {
if (acc == null) acc = [];
if (len <= 1) return acc;
var b = makeRec(len >> 1, [0]);
b = b.concat(b);
if (len & 1) b = b.concat([0]);
return b;
},
使用makeRec(29)调用该方法。
用预先计算的值填充数组的优雅方式
这里有另一种使用ES6的方法,到目前为止没有人提到:
> Array.from(Array(3), () => 0)
< [0, 0, 0]
它通过传递一个map函数作为Array.from的第二个参数来工作。
在上面的示例中,第一个参数分配一个由3个位置组成的数组,其中填充了未定义的值,然后lambda函数将每个位置映射到值0。
虽然Array(len).fill(0)更短,但如果您需要先进行一些计算来填充数组,它就不起作用了(我知道这个问题并没有提出,但很多人最终都在这里寻找这个问题)。
例如,如果需要包含10个随机数的数组:
> Array.from(Array(10), () => Math.floor(10 * Math.random()))
< [3, 6, 8, 1, 9, 3, 0, 6, 7, 1]
它比同类产品更简洁(更优雅):
const numbers = Array(10);
for (let i = 0; i < numbers.length; i++) {
numbers[i] = Math.round(10 * Math.random());
}
此方法还可用于通过利用回调中提供的索引参数生成数字序列:
> Array.from(Array(10), (d, i) => i)
< [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
额外答案:使用String repeat()填充数组
由于这个答案受到了很多关注,我也想展示一下这个很酷的技巧。虽然不如我的主要答案有用,但将介绍一个仍然不是很有名,但非常有用的Stringrepeat()方法。诀窍如下:
> "?".repeat(10).split("").map(() => Math.floor(10 * Math.random()))
< [5, 6, 3, 5, 0, 8, 2, 7, 4, 1]
酷吧?repeat()是创建字符串的一种非常有用的方法,该字符串将原始字符串重复一定次数。之后,split()为我们创建一个数组,然后将其映射()到所需的值。按步骤分解:
> "?".repeat(10)
< "??????????"
> "?".repeat(10).split("")
< ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]
> "?".repeat(10).split("").map(() => Math.floor(10 * Math.random()))
< [5, 6, 3, 5, 0, 8, 2, 7, 4, 1]
洛达什:
_.fill(array, value)
是一种干净且跨浏览器安全的填充数组的方法。
这里最快的是
(arr = []).length = len; arr.fill(0);
const item = 0
const arr = Array.from({length: 10}, () => item)
常量项=0constarr=Array.from({length:42},()=>项)控制台日志('arr',arr)