我试图合并&像这样添加这两个对象:
obj1 = {
jpg: 1,
gif: 3,
}
obj2 = {
jpg: 1,
avi: 5,
}
obj3 = mergeAdd(obj1, obj2);
// obj3 = {
// jpg: 2,
// gif: 3,
// avi: 5,
// }
首先,我创建了这个需要O(n ^ 2)的人:
for (let foo in obj1) {
for (let bar in obj2) {
if (foo === bar) {
// Exists : Add count
obj1[bar] += obj2[bar];
} else {
// Don`t Exists : Copy from obj2
obj1[bar] = obj2[bar];
}
}
}
然后,我想到了一个“新想法” - 使用哈希函数:
我想知道的事情:
谢谢!
答案 0 :(得分:3)
具有线性复杂性的解决方案。
var obj1 = { jpg: 1, gif: 3, },
obj2 = { jpg: 1, avi: 5, },
merged = function (array) {
var r = {};
array.forEach(function (a) {
Object.keys(a).forEach(function (k) {
r[k] = (r[k] || 0) + a[k];
});
});
return r;
}([obj1, obj2]);
document.write('<pre>' + JSON.stringify(merged, 0, 4) + '</pre>');
答案 1 :(得分:1)
你能用ES6吗?您可以使用新的Object.assign()方法轻松完成此操作:
let newObj = Object.assign({}, obj1, obj2);
没有ES6:
var newObj = {};
obj1 = {
jpg: 1,
gif: 3,
};
obj2 = {
jpg: 1,
avi: 5,
};
Object.keys(obj1).forEach(function(k) {
newObj[k] = obj1[k];
});
Object.keys(obj2).forEach(function(e) {
newObj[e] = obj2[e];
});
答案 2 :(得分:0)
通用递归/功能解决方案。获取对象数组并将每个对象合并到输出对象中。不知道它与其他答案相比有多高效 - 它可能非常糟糕。
function addValues(obj) {
return function (p, c) {
p[c] = (p[c] || 0) + obj[c];
return p;
}
}
function mergeObject(obj, out) {
return Object.keys(obj).reduce(addValues(obj), out);
}
function processArray(arr, fn, out) {
out = out || {};
if (!arr.length) return out;
out = fn(arr.shift(), out);
return processArray(arr, fn, out);
}
var arr = [{ jpg: 1, gif: 3 }, { jpg: 1, avi: 5, }];
processArray(arr, mergeObject); // { jpg: 2, gif: 3, avi: 5 }