我有一个声明为
的数组var arr = new Array();
然后我有一个由Server返回的对象数组。并且此数组中的每个对象都有三个字段(总是)。我必须遍历这个并有条件地添加到 arr 数组。
由于 arr 未预先分配,因此它会在主阵列中达到大数字的性能。
在获得主响应数组后,有什么办法可以预先分配 arr 数组,以便我可以避免这个性能问题吗?
另外我如何获得对象的大小?
感谢。
答案 0 :(得分:8)
假设您有10个对象,并且您将从每个对象传递三个值到一个数组。您可以通过将整数30传递给Array构造函数来初始化长度为30(10 * 3)的数组:
var numObjects = 10;
var myArray = new Array(3*numObjects);
请参阅我的jsperf基准测试,了解获得的性能证明。简而言之,在Firefox 38中预先调整阵列大小要快25%,在Chrome 42中大约快81%,在Internet Explorer 11中大约快16%。数字会因个人运行这些基准测试的经验而异,但是趋势将保持一致。通过预先调整阵列大小,可以获得最佳性能 http://jsperf.com/array-growth-dynamic-vs-preset
在这里发表了关于这个主题的更全面的讨论 How to initialize an array's length in javascript?
答案 1 :(得分:2)
感谢你相信(或不相信)Javascript没有任何直接访问内存分配的神。考虑到乱扔垃圾的大部分JS的质量,这本来是非常可怕的。
Javascript本身会在创建时为内存分配内存,并在收集垃圾时回收内存。 预填充数组对内存使用或性能没有任何积极影响。
编辑:我错了。请参阅@ ThisClark的回答。
MDN在javascript中有一个非常好的article on how memory management and GC work。
答案 2 :(得分:1)
您可以使用filter
函数过滤数组,如下例
var result = [
{
age: 15
},
{
age: 21
},
{
age: 25
}
];
function isGreaterThan20(obj) {
return obj.age > 20;
}
var arr = result.filter(isGreaterThan20);
// arr becomes [{ age: 21}, { age: 25}]
如果您需要预先分配定义大小的数组,请使用new Array(size)