【发布时间】:2013-12-11 21:59:23
【问题描述】:
创建任意长度的零填充 JavaScript 数组的最有效方法是什么?
【问题讨论】:
-
有什么理由你想要零填充而不是用
undefined填充的X长度数组,可以很容易地声明为new Array(x),其中x是0到2之间的整数^ 32 - 1.
标签: javascript
创建任意长度的零填充 JavaScript 数组的最有效方法是什么?
【问题讨论】:
undefined填充的X长度数组,可以很容易地声明为new Array(x),其中x是0到2之间的整数^ 32 - 1.
标签: javascript
默认情况下,Uint8Array、Uint16Array 和 Uint32Array 类将零作为其值,因此您不需要任何复杂的填充技术,只需:
var ary = new Uint8Array(10);
数组ary的所有元素默认为零。
【讨论】:
在 Javascript ES6 中有一个非常简单的解决方案。我来这里是因为我想缩短代码高尔夫:
n = 999 // arbitrary length
a = Array(n).fill(0)
console.log(a)
【讨论】:
新的 ES6 数组扩展允许您使用 fill 方法本地执行此操作。现在 IE edge、Chrome 和 FF 都支持了,但是查看compatibility table
new Array(3).fill(0) 会给你[0, 0, 0]。您可以使用任何值填充数组,例如 new Array(5).fill('abc')(甚至是对象和其他数组)。
除此之外,您还可以使用填充修改以前的数组:
arr = [1, 2, 3, 4, 5, 6]
arr.fill(9, 3, 5) # what to fill, start, end
给你:[1, 2, 3, 9, 9, 6]
【讨论】:
这样试试怎么样:
Array.apply(null, new Array(10)).map(Number.prototype.valueOf,0);
//Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
或
new Array(10+1).join('0').split('').map(parseFloat)
//Output as [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
编辑:-
如果您的数组是动态的,那么只需将其放入一个函数中,该函数接受一个数字并将 10 替换为该变量。
【讨论】:
push 的for循环?
如果你想要一个 9 长度的数组:
Array.apply(null, {length: 9}).map(function() {return 0;})
如果你想要一个 X 长度的数组:
Array.apply(null, {length: X}).map(function() {return 0;})
如果你有一个数组并想重写它的值:
var arr=[54,53,6,7,88,76]
arr=arr.map(function() {return 0;})
你可以用你想要的任何东西填充数组,只需在 .map 中的 function 中更改 return 的值:: p>
Array.apply(null, {length: 9}).map(function() {return "a string";})
Array.apply(null, {length: 9}).map(function() {return Math.random();})
Array.apply(null, {length: 9}).map(function() {return NaN;})
Array.apply(null, {length: 9}).map(function() {return null;})
Array.apply(null, {length: 9}).map(function() {return true;})
Array.apply(null, {length: 9}).map(function() {return;})
最后一个将用 undefined
填充数组【讨论】:
function repeatArray(value, len){
var A=[],i=0;
while (i<len) A[i++]= value;
return A;
}
【讨论】:
我测试了两个 Unit8Array
[].slice.apply(new Uint8Array(n));
和join/split方法
new Array(n + 1).join('0').split('').map(parseFloat);
在jsPerf 中获得有趣的结果。 Chrome 和 Firefox 在这两个方面都相当慢(在 48,000 到 76,000 次操作之间)。但是 Opera 和 Safari 在 Uint8Array 函数(最多 438,000 次操作)上的表现都非常出色。我想我会开始使用 Uint8Array 并希望 Chrome 和 Firefox 有所改进。
【讨论】:
一种方法可以使用递归。
function fillArray(l, a) {
a = a || [];
if (0 < l) {
l -= 1;
a[l] = 0;
return fillArray(l, a);
}
return a;
}
我还发布了一个更经典的选项:
function fillArray(l) {
var a;
for (a = []; 0 < l; l-=1, a[l]=0);
return a;
}
【讨论】: