从对象数组构建对象的最高效方法

时间:2015-03-30 17:06:45

标签: javascript arrays object

目前,我正在使用以下内容从对象数组构建对象:

var popOverOptions = {
  defaultOption: true
}

if (a) {
  options.push({a: "b"});
}

if (c) {
  options.push({c: "d"});
}

// Loop through array of objects
for (var i = 0; i < options.length; i++) {
   // Add objects in array to popoverOptions object
   for (key in options[i]) {
     popoverOptions[key] = options[i][key]
   }
}

我认为这可以进行优化,如果有更好的方法可以使用.reduce(),. forEach()或其他方法,我很好奇。

3 个答案:

答案 0 :(得分:3)

在ECMAScript 6中,您可以使用

Object.assign(popOverOptions, ...options);

答案 1 :(得分:1)

您可以像这样优化循环:

for (var i=0, n=options.length; i<n; ++i) {

这减少了你需要访问options.length的次数,这比从本地读取它要慢。

较小的优化:

for (var i=options.length-1; i--; /* empty */) {

来源:http://www.phpied.com/extreme-javascript-optimization/

答案 2 :(得分:0)

您可以缓存length以提高速度。

如果数组中的键对于每个元素都相同,则可以通过缓存Object.keys(options[0])获得两倍的速度(在Chrome中),并迭代它。

即使键不是相同,你仍然可以获得约。迭代Object.keys(options[i])可以使速度提高25%。

&#13;
&#13;
var options= [];

for(var i = 0 ; i <= 1000 ; i++) {  //create array of objects with random numbers
  options[i]= {};
  for(var j = 0 ; j <= 5000 ; j++) {
    options[i][j]= Math.random();
  }
}

var popOverOptions = {};

function keyin() {
  var timer= new Date();
  for(var i = 0, leni = options.length ; i < leni; i++) {
    for(var key in options[i]) {
      popOverOptions[key] = options[i][key];
    }
  }
  alert((new Date()-timer)/1000+' seconds');
} //keyin

function objkeys(same) {
  var timer= new Date(),
      keys= Object.keys(options[0]);

  for(var i = 0, leni = options.length ; i < leni; i++) {
    if(!same) keys= Object.keys(options[i]);
    for(var key = 0, lenk = keys.length ; key < lenk ; key++) {
      popOverOptions[keys[key]] = options[i][keys[key]];
    }
  }
  alert((new Date()-timer)/1000+' seconds');
} //objkeys
&#13;
<button onclick="keyin()">key in options</button><br>
<button onclick="objkeys(true)">Object.keys, same keys per element</button><br>
<button onclick="objkeys(false)">Object.keys, different keys per element</button>
&#13;
&#13;
&#13;

相关问题