目前,我正在使用以下内容从对象数组构建对象:
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()或其他方法,我很好奇。
答案 0 :(得分:3)
在ECMAScript 6中,您可以使用
Object.assign
将属性复制到popOverOptions
options
数组。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 */) {
答案 2 :(得分:0)
您可以缓存length
以提高速度。
如果数组中的键对于每个元素都相同,则可以通过缓存Object.keys(options[0])
获得两倍的速度(在Chrome中),并迭代它。
即使键不是相同,你仍然可以获得约。迭代Object.keys(options[i])
可以使速度提高25%。
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;