在JavaScript中创建任意长度的零填充数组最有效的方法是什么?
当前回答
我通常使用Uint8Array(速度惊人)。例如,创建1M个元素的零填充矢量:
var zeroFilled = [].slice.apply(new Uint8Array(1000000))
我是一个Linux用户,一直为我工作,但有一次,一个朋友使用Mac时有一些非零元素。我以为他的机器出故障了,但我们找到了最安全的方法来修复它:
var zeroFilled = [].slice.apply(new Uint8Array(new Array(1000000))
已编辑
铬25.0.1364.160
弗雷德里克·戈特利布-6.43萨姆·巴纳姆-4.83伊莱-3.68约书亚2.91马修·克鲁姆利-2.67硼-2.55艾伦·赖斯-2.11康纳斯-0.68推压器温度-0.67zertosh-错误
Firefox 20.0
艾伦·赖斯-1.85约书亚-1.82马修·克鲁姆利-1.79硼-137弗雷德里克·戈特利布-0.67萨姆·巴纳姆-0.63伊莱-0.59kagax-0.13推压器温度-0.13zertosh-错误
错过了最重要的测试(至少对我来说):Node.js测试。我怀疑它接近Chrome基准。
其他回答
我已经测试了IE 6/7/8、Firefox 3.5、Chrome和Opera中预分配/不预分配、向上/向下计数和for/while循环的所有组合。
下面的功能在Firefox、Chrome和IE8中始终是最快的或非常接近的,并且不比Opera和IE6中最快的慢太多。在我看来,这也是最简单明了的。我发现了几个while循环版本稍快的浏览器,所以我也将其包括在内以供参考。
function newFilledArray(length, val) {
var array = [];
for (var i = 0; i < length; i++) {
array[i] = val;
}
return array;
}
or
function newFilledArray(length, val) {
var array = [];
var i = 0;
while (i < length) {
array[i++] = val;
}
return array;
}
使用lodash或下划线
_.range(0, length - 1, 0);
或者,如果您已有一个数组,并且需要一个相同长度的数组
array.map(_.constant(0));
截至ECMAScript2016,大型阵列有一个明确的选择。
由于这一答案在谷歌搜索中仍然排名靠前,所以这里有一个2017年的答案。
这里有一个当前的jsbench,其中有几十种流行的方法,包括迄今为止提出的许多方法。如果你找到更好的方法,请添加、分叉和分享。
我想指出,没有真正最有效的方法来创建任意长度的零填充数组。您可以优化速度,也可以优化清晰度和可维护性——根据项目的需要,两者都可以被视为更有效的选择。
在优化速度时,您需要:使用文字语法创建数组;设置长度,初始化迭代变量,并使用while循环遍历数组。这里有一个例子。
常量arr=[];arr.length=120000;设i=0;而(i<120000){arr[i]=0;i++;}
另一种可能的实施方式是:
(arr = []).length = n;
let i = 0;
while (i < n) {
arr[i] = 0;
i++;
}
但我强烈反对在实践中使用第二次植入,因为它不太清楚,也不允许在数组变量上保持块范围。
这比用for循环填充要快得多,比标准方法快90%左右
const arr = Array(n).fill(0);
但这种填充方法由于其清晰、简洁和可维护性,对于较小的阵列来说仍然是最有效的选择。除非您制作了大量长度为数千或更多的阵列,否则性能差异可能不会让您丧命。
其他一些重要的注意事项。大多数风格指南都建议您在使用ES6或更高版本时,如果没有非常特殊的原因,不要再使用var。对于不会被重新定义的变量使用const,对于会被重新定义变量使用let。MDN和Airbnb的风格指南是获取更多最佳实践信息的好地方。这些问题并不涉及语法,但重要的是,在搜索大量新旧答案时,熟悉JS的人必须了解这些新标准。
新的Array(51).join(“0”).split(“”)怎么样?
已经提到的ES6填充方法很好地解决了这个问题。截至目前,大多数现代桌面浏览器已经支持所需的Array原型方法(Chromium、FF、Edge和Safari)[1]。您可以在MDN上查找详细信息。一个简单的用法示例是
a = new Array(10).fill(0);
考虑到当前的浏览器支持,除非您确定您的受众使用的是现代桌面浏览器,否则您应该谨慎使用。