之前我曾问过这个问题,但似乎解决方案效果不佳。
我有两个对象:
var a = [{ x: 0, y: 0, color: "green", value: undefined, weight: 1 }, { x: 0, y: 1, color: "red", value: undefined, weight: 1 }];
var b = [{ x: 0, y: 0, value: 1}, { x: 0, y: 1, value: 3}];
我想将它们加入到一个对象中,如下所示:
var c = [{ x: 0, y: 0, color: "green", value: 1, weight: 1 }, { x: 0, y: 1, color: "red", value: 3, weight: 1 }];
注意:数组A总是有25个条目,而数组b不是。
建议的解决方案是:
var extendedArray = $.extend({}, a, b);
然而,这会产生两个条目的数组,其中并不保留所有值。
我也尝试了以下功能:
var e = $.merge(a, b);
var output = a.concat(b);
function jsonConcat(o1, o2) {
for (var key in o2) {
o1[key] = o2[key];
}
return o1;
}
var c = {};
c = jsonConcat(c, a);
c = jsonConcat(c, b);
非常感谢任何帮助或推动正确的方向!
答案 0 :(得分:1)
$.extend
的 true
只会合并对象的“第一级”。如果您的属性只是字符串和数字,它可以工作,但如果某些属性是对象,则可能导致意外行为。
我认为你正在寻找$.extend(true,obj1,obj2)
。
var a = [{ x: 0, y: 0, color: "green", value: undefined, weight: 1 }, { x: 0, y: 1, color: "red", value: undefined, weight: 1 }];
var b = [{ x: 0, y: 0, value: 1, weight: 1 }, { x: 0, y: 1, value: 3, weight: 1 }];
var c = $.extend(true,[],a,b);
console.log(c instanceof Array); // true
有关详细信息,请参阅the doc
第一个参数true
告诉方法以递归方式执行“深度”复制。
答案 1 :(得分:1)
假设两个数组具有相同的长度,就地合并可能是这样的:
var a = [{ x: 0, y: 0, color: "green", value: undefined, weight: 1 }, { x: 0, y: 1, color: "red", value: undefined, weight: 1 }];
var b = [{ x: 0, y: 0, value: 1, weight: 1 }, { x: 0, y: 1, value: 3, weight: 1 }];
function merge_objects(o1, o2) {
Object.keys(o2).forEach(
function(key) {
o1[key] = o2[key];
});
}
function merge(a, b) {
if (a.length != b.length) {
throw new Error();
}
for (var ix=0; ix<a.length; ix++) {
merge_objects(a[ix], b[ix]);
}
}
答案 2 :(得分:1)
编辑反映b可以更小但从不大于a。
function merge(a,b){
//Don't want to mutate a
var result = a.slice();
for(var i = 0; i < b.length; i++){
for (var attrname in b[i]) {
result[i][attrname] = b[i][attrname];
}
}
return result;
}
代码部分取自How can I merge properties of two JavaScript objects dynamically?
中接受的答案