Koe*_*ren 41 javascript arrays
只是一个小问题.
我正在玩弄一点,并试图实例化一个新的长度x数组,其中该数组的所有元素初始化为值y
var arr = new Array(x).fill(y);
Run Code Online (Sandbox Code Playgroud)
如果y的值不是对象,则此方法很有效.意思是y是一个对象,以下是正确的:
var arr = new Array(2).fill({});
arr[0] === arr[1]; //is true;
arr[0].test = 'string';
arr[1].test === 'string'; //is also true;
Run Code Online (Sandbox Code Playgroud)
有没有办法说明在使用fill-function时应该为每个元素创建一个新对象?或者我应该将其转换为循环?
提前致谢!
Ori*_*iol 47
您可以先fill使用任何值(例如undefined)的数组,然后您将能够使用map:
var arr = new Array(2).fill().map(u => ({}));
Run Code Online (Sandbox Code Playgroud)
var arr = new Array(2).fill().map(Object);
Run Code Online (Sandbox Code Playgroud)
Kos*_*nos 19
接受的答案是好的,并且在90%的案例中都有效.
但是如果你正在制作高性能的JS应用程序,并且如果使用大/大数组,则Array.map(..)会在内存和处理器使用方面产生大的重载,因为它会创建一个数组副本.
我建议使用经典的for循环:
a = new Array(ARRAY_SIZE);
for (var i = 0; i < ARRAY_SIZE; i++) {
a[i] = [];
}
Run Code Online (Sandbox Code Playgroud)
我测试了三个替代方案,得到了这个
建议答案(11倍!!!慢):
a = new Array(ARRAY_SIZE).fill().map(u => { return []; });
Run Code Online (Sandbox Code Playgroud)简单循环(最快):
a = new Array(ARRAY_SIZE);
for (var i = 0; i < ARRAY_SIZE; i++) {
a[i] = [];
}
Run Code Online (Sandbox Code Playgroud)forEach(慢2倍):
a = new Array(ARRAY_SIZE).fill();
a.forEach((val, i) => {
a[i] = [];
})
Run Code Online (Sandbox Code Playgroud)PS.我用这个小提琴进行测试.
一个高性能解决方案:
Array.from({ length: 5 }, () => new Object())
最短的可能:
let node = [...Array(2)].map(_=>({}))
console.log(node)Run Code Online (Sandbox Code Playgroud)