在JavaScript中创建任意长度的零填充数组最有效的方法是什么?
当前回答
在答案中没有看到这种方法,所以这里是:
"0".repeat( 200 ).split("").map( parseFloat )
结果,您将得到长度为200的零值数组:
[ 0, 0, 0, 0, ... 0 ]
我不确定这段代码的性能,但如果您将它用于相对较小的阵列,这应该不是问题。
其他回答
const arr=数组.from({长度:10}).fill(0);控制台日志(arr)
用预先计算的值填充数组的优雅方式
这里有另一种使用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]
在我的测试中,这是我电脑中最快的
1亿个元素需要大约350毫秒。
"0".repeat(100000000).split('');
对于相同数量的元素,map(()=>0)需要大约7000毫秒,这是一个巨大的差异
其他人似乎缺少的是预先设置数组的长度,这样解释器就不会不断改变数组的大小。
我的简单一行代码是Array.protocol.slice.apply(newUint8Array(长度))
但是,如果我要创建一个函数来快速执行,而不需要一些复杂的变通方法,我可能会编写一个这样的函数:
var filledArray = function(value, l) {
var i = 0, a = []; a.length = l;
while(i<l) a[i++] = value;
return a;
}
值得指出的是,Array.prototype.fill是作为ECMAScript 6(Harmony)提案的一部分添加的。在考虑线程中提到的其他选项之前,我宁愿使用下面写的polyfill。
if (!Array.prototype.fill) {
Array.prototype.fill = function(value) {
// Steps 1-2.
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this);
// Steps 3-5.
var len = O.length >>> 0;
// Steps 6-7.
var start = arguments[1];
var relativeStart = start >> 0;
// Step 8.
var k = relativeStart < 0 ?
Math.max(len + relativeStart, 0) :
Math.min(relativeStart, len);
// Steps 9-10.
var end = arguments[2];
var relativeEnd = end === undefined ?
len : end >> 0;
// Step 11.
var final = relativeEnd < 0 ?
Math.max(len + relativeEnd, 0) :
Math.min(relativeEnd, len);
// Step 12.
while (k < final) {
O[k] = value;
k++;
}
// Step 13.
return O;
};
}