有没有更紧凑的方式来进行这种初始化?
for (var i = 0; i < arraySize; i++) array[i] = value;
Run Code Online (Sandbox Code Playgroud)
Kla*_*sen 107
一个简单的方法是:
var arr = Array(arraySize).fill(value);
Run Code Online (Sandbox Code Playgroud)
将使arr = Array [ 0, 0, 0, 0, 0 ]如果arraySize == 5和value == 0,例如.
DoX*_*icK 36
while(arraySize--) array.push(value);
Run Code Online (Sandbox Code Playgroud)
没有初始化(我知道)
更新
自从4年前发布这个答案以来,人们似乎不断回到这里寻求答案.出于基准测试目的,我使用一些不同的解决方案制作了JSPerf.
上面的解决方案并不是最快的,尽管它很短.要坚持相同的短款式,但性能更佳:
while(size--) array[size] = value;
Run Code Online (Sandbox Code Playgroud)
2016年2月 更新使用包含更多测试用例的新版本更新了JSPerf.
如果表现无关紧要,你想要一个单行:
var value = 1234, // can be replaced by a fixed value
size = 1000, // can be replaced by a fixed value
array = Array.apply(null,{length: size}).map(function() { return value; });
Run Code Online (Sandbox Code Playgroud)
一个更高性能的解决方案(在一个,脏,行): 请注意:这将替换范围中的存在值,大小和i变量
for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
Run Code Online (Sandbox Code Playgroud)
OP似乎是在一次性使用场景中的紧凑性之后,而不是效率和可重用性.对于寻求效率的其他人来说,这是一个尚未提及的优化.由于您事先知道了数组的长度,因此请在分配值之前进行设置.否则,阵列将在运行中反复调整大小 - 不理想!
function initArray(length, value) {
var arr = [], i = 0;
arr.length = length;
while (i < length) { arr[i++] = value; }
return arr;
}
var data = initArray(1000000, false);
Run Code Online (Sandbox Code Playgroud)
这不是那么紧凑,但可以说更直接.
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
Run Code Online (Sandbox Code Playgroud)
这是一个老问题,但我在现代 JS 中使用它:
[...new Array(1000000)].map(()=>42);
Run Code Online (Sandbox Code Playgroud)
这可能不比上述任何技术更好,但它很有趣......
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64869 次 |
| 最近记录: |