加入对象数组

时间:2014-08-01 07:46:03

标签: javascript arrays object join merge

之前我曾问过这个问题,但似乎解决方案效果不佳。

我有两个对象:

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);

非常感谢任何帮助或推动正确的方向!

3 个答案:

答案 0 :(得分:1)

没有第一个参数设置为$.extend

true只会合并对象的“第一级”。如果您的属性只是字符串和数字,它可以工作,但如果某些属性是对象,则可能导致意外行为。

我认为你正在寻找$.extend(true,obj1,obj2)

example

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?

中接受的答案