Javascript 使用单个值初始化数组
有没有更紧凑的方法来进行这种初始化Javascript 使用单个值初始化数组,javascript,Javascript,有没有更紧凑的方法来进行这种初始化 for (var i = 0; i < arraySize; i++) array[i] = value; for(var i=0;i
for (var i = 0; i < arraySize; i++) array[i] = value;
for(var i=0;i
没有初始化(据我所知)
更新 自从4年前发布这个答案以来,人们似乎一直在这里寻找这个答案。出于基准测试的目的,我用一些不同的解决方案做了一个 上面的解决方案虽然简短,但不是最快的。要坚持相同的短款风格,但性能更好:
while(size--) array[size] = value;
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; });
更高性能的解决方案(在一条脏线中):
请注意:这将替换范围中现有的值、大小和i变量
for(变量i=0,值=1234,大小=1000,数组=新数组(1000);i
如果需要多次执行此操作,则始终可以编写函数:
function makeArray(howMany, value){
var output = [];
while(howMany--){
output.push(value);
}
return output;
}
var data = makeArray(40, "Foo");
而且,仅仅为了完整性(摆弄内置对象的原型通常不是一个好主意):
因此,您现在可以:
var data = [];
data.fill(40, "Foo");
更新:我刚刚看到你关于
arraySize
是常量或文本的说明。如果是这样的话,只需将所有while(howMany--)
替换为好的for(var i=0;i为了提高效率,我将避免推送
for (var i = 0; i < arraySize; i++) array[i] = value;
for(var i=0;i
对于IE10:
array = new Array(arraySize);
for (var i = 0; i < arraySize; i++) array[i] = value;
array=新数组(arraySize);
对于(var i=0;i
编辑:根据评论中的讨论进行了修改。在单次使用场景中,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);
函数initArray(长度、值){
var arr=[],i=0;
arr.length=长度;
而(i
这不可能比上述任何技术都好,但很有趣
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
这不是很紧凑,但可以说更直接
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
一个简单的方法是:
var arr = Array(arraySize).fill(value);
例如,如果arraySize==5
和value==0
,则会使arr=Array[0,0,0,0,0]
。在平面上探索数组方法时偶然发现了这个问题。。哦,我们无聊时会去哪些地方。)
.map()
和null
获胜!我喜欢null,因为用“0”或任何其他值传入类似up top的字符串会令人困惑。我认为这更清楚地表明,我们正在做一些不同的事情
请注意,.map()
跳过未初始化的值。这就是为什么newarray(30).map(函数(项,索引){returnindex})代码>不起作用。如果可用,则首选新的.fill()
方法,但应注意从2015年8月23日起对浏览器的支持
桌面(基本支持)
- 铬45(36)
- 火狐(壁虎)31(31)
- 不支持Internet Explorer
- Opera不受支持
- Safari 7.1
发件人:
这是一个老问题,但我在现代JS中使用:
[...new Array(1000000)].map(()=>42);
在许多情况下,“arraySize”是不可变的(可以是常量或文字,或者-我知道,糟糕的做法-“array.length”)。通过将大小表示为一个变量,我使这一点变得不清楚。true:“for(var I=arraySize;I--;)array.push(value);”然后:-)但我想你已经明白了你是对的-这种语法确实减少了五个字符。;-)<对于JavaScript中的
,code>while
比慢2倍,而像if(number)
这样的简单检查也比if(number==0)
慢,因为类型转换(这也适用于布尔、字符串和null)。我的jsPerf测试教会了我这一点:新数组(len).fill(0)<代码>for(var i=0;i
的性能几乎与代码相同,但看起来更干净。但是while(arraySize--)
的速度要慢两倍。是的,但是array
的内存分配比启动array[0]
更有效。否。如果从末尾开始初始化数组,将在内部使用哈希表,但是如果从0开始初始化数组,并且只有顺序索引,则将使用真正的数组(至少在V8中)。JavaScript不分配(最高索引+1)元素,它只分配初始化的元素。参考[Slide 54]()在JavaScript中,
的速度是的2倍,而的速度是的2倍。我不会说这是那么精确:当然,你不希望总是只使用这两种方法,这会破坏它们的用途。解释器/编译器的工作应该是尽可能地加快速度,而不是你的。但即使这样也不总是正确的。IE不支持:@Perry。你知道,当市场占有率为6%的浏览器不支持该标准时,如果值是一个对象,则浏览器会小心地使用fill函数,因为在整个数组中可能有相同的对象,这可能会导致不必要的结果。你能解释为什么var arr=(新数组(5)).map() => 1);代码>不起作用?map()方法只对数组中的值起作用。它跳过未定义的元素。所以在新建数组(5)
之后,当我们进行映射时,我们不是在数组上操作吗?另外,这个[1,未定义,3].map(()=>5)
也可以正常工作。它不会跳过mozilla文档中的undefined
:map为数组中的每个元素、顺序和构造调用一次提供的回调函数
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
var arr = Array(arraySize).fill(value);
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
return index;
});
[1, 2, 3].fill(4); // [4, 4, 4]
[1, 2, 3].fill(4, 1); // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2); // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1); // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2); // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN); // [1, 2, 3]
Array(3).fill(4); // [4, 4, 4]
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
[...new Array(1000000)].map(()=>42);