在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等更有效。
其他回答
ES6引入了Array.prototype.fill。它可以这样使用:
new Array(len).fill(0);
不确定它是否很快,但我喜欢它,因为它很短,很自我描述。
它仍然不在IE中(检查兼容性),但有一个polyfill可用。
使用对象表示法
var x = [];
零填充?喜欢
var x = [0,0,0,0,0,0];
填充了“undefined”。。。
var x = new Array(7);
带零的obj符号
var x = [];
for (var i = 0; i < 10; i++) x[i] = 0;
作为补充说明,如果修改Array的原型
var x = new Array();
and
var y = [];
将对原型进行修改
无论如何,我不会过分关注这个操作的效率或速度,你可能会做很多其他事情,这些事情比安装一个包含零的任意长度数组更浪费和昂贵。
var str = "0000000...0000";
var arr = str.split("");
表达式中的用法:arr[i]*1;
编辑:如果arr应该在整数表达式中使用,那么请不要介意字符值“0”。您只需按如下方式使用它:a=a*arr[i](假设a具有整数值)。
我通常使用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基准。
最快的方法是使用forEach=)
(我们保持IE<9的向后兼容性)
var fillArray = Array.prototype.forEach
? function(arr, n) {
arr.forEach(function(_, index) { arr[index] = n; });
return arr;
}
: function(arr, n) {
var len = arr.length;
arr.length = 0;
while(len--) arr.push(n);
return arr;
};
// test
fillArray([1,2,3], 'X'); // => ['X', 'X', 'X']