合并两个对象而不添加新属性

时间:2014-02-12 11:00:28

标签: javascript jquery json

我想要合并两个JSON对象,以便只更新已存在的第一个对象中的属性值。

我想用第二个

扩展第一个对象
var obj1 = {a:'apple', b:'banana', c:'cucumber'};
var obj2 = {a:'aarbei', b:'beet', d:'durian'};

并获得此结果

{a:'aarbei', b:'beet', c:'cucumber'};

而不是(我使用$.extend

{a:'aarbei', b:'beet', c:'cucumber', d:'durian'};

实际上,我的JSON对象可以更大,并且包含未知复杂性的嵌套对象/数组

4 个答案:

答案 0 :(得分:4)

简单的for循环怎么样:

for (var key in obj2) {
    if (key in obj1) {
        obj1[key] = obj2[key];
    }
}

对于嵌套对象,您可以将此代码包装为递归函数:

function mergeObj(a, b) {
    for (var key in b) {
        if (key in a) {
            a[key] = typeof a[key] === 'object' && typeof b[key] === 'object' ? mergeObj(a[key], b[key]) : b[key];
        }
    }
    return a;
}

演示:http://jsfiddle.net/rHUM6/

答案 1 :(得分:1)

这应该有用......

function mergeObjs () {
    for (var key in obj2) {
         if (obj1.hasOwnProperty(key)) {
             obj1[key] = obj2[key]
         }
    }
    return obj1;
}

var mergedObjs = mergeObjs();

答案 2 :(得分:1)

我采用了不同的方法,从每个对象的副本中修剪不需要的属性,然后使用这些对象扩展新对象。

var obj1 = {a:'apple', b:'banana', c:'cucumber'};
var obj2 = {a:'aarbei', b:'beet', d:'durian'};
var keepProps = ["a", "b", "c"];

var trimmedObj1 = trim(obj1, keepProps);
var trimmedObj2 = trim(obj2, keepProps);

var obj3 = $.extend({}, trimmedObj1, trimmedObj2);
console.log(obj3);

function trim(obj, properties){
    var copy = $.extend({}, obj);
    for(x in obj){
        if(obj.hasOwnProperty(x) && properties.indexOf(x) == -1){
            delete copy[x];
        }
    }
    return copy;
}

JS小提琴: http://jsfiddle.net/m8NCc/

答案 3 :(得分:0)

Javascript继承并不复杂。

如果您有对象,请说ObjectA喜欢

function ObjectA () {
    this.a = "Hello";
    this.a = "World";
    this.c = 30;
}

然后你想继承这个对象:

function ObjectB () {
    ObjectA.call(this);// Call the super constructor
}
ObjectB.prototype = Object.create(ObjectA.prototype); // Inheritance
ObjectB.prototype.constructor = ObjectB; 

最后,您可以访问和/或修改ObjectA中的任何属性,如:

var o = new ObjectB();
o.a = "Hi";

如果您需要解析JSON对象,请参阅this(引用自己:/)。