将一个对象的选定属性值复制到另一个对象

时间:2015-07-06 06:32:10

标签: javascript object copy

我有2个javascript对象:obj_a和obj_b:

var obj_a = {'p1':{x:100, y:200, z:100}, 'p2':{x:100, y:100, z:300}};
var obj_b = {'p1':{x:100, y:200}, 'p2':{x:100, y:100}};

我试图只复制" x和y值"如果他们不同,obj_b到obj_a。 例如,

如果obj_b = {'p1':{x:200, y:200}, 'p2':{x:300, y:400}};

final obj_a将为obj_a = {'p1':{x:200, y:200, z:100}, 'p2':{x:300, y:400, z:300}};。完全无视财产" z" obj_a。

所以,我写了以下内容:

function isDifferent(a, b) {
    var aProps = Object.getOwnPropertyNames(a);
    var bProps = Object.getOwnPropertyNames(b);
    for (var i = 0; i < bProps.length; i++) {
        var propName = bProps[i];
         if (a[propName] != b[propName]) {
            return true;
        }
    }
    return false;
}
for (var prop in obj_b){
    if(isDifferent(obj_a[prop], obj_b[prop]){
        var bProps = Object.getOwnPropertyNames(obj_b[prop]);
        for (var i = 0; i < bProps.length; i++){
            var propName = bProps[i];
            obj_a[prop].propName = obj_b[prop].propName;
        }
    }
}

但是使用obj_a [prop] .propName进行复制存在问题,因为我只在console.log(obj_a[prop].propName);时才得到未定义。当我尝试console.log(obj_a[p1].x);时,输出是旧值:&#34; 200&#34;。有人可以启发我吗?

2 个答案:

答案 0 :(得分:3)

如果您通过存储在变量中的名称引用对象属性,则需要使用bracket notation。在你的情况下,而不是

var propName = bProps[i];
obj_a[prop].propName = obj_b[prop].propName;

使用

var propName = bProps[i];
obj_a[prop][propName] = obj_b[prop][propName];

答案 1 :(得分:2)

您应该使用obj_a[prop][propName]object[prop].propNameobject[prop]["propName"]相同,这意味着它会搜索名称为&#34; propName&#34;的属性。的字面上即可。

因此,obj_a[p1].x将返回您期望的值,但obj_a[p1].propName将是未定义的,因为您的obj_a [p1]没有属性名称&#34; propName&#34;。

你想要的是治疗&#34; propName&#34;作为&#34;字符串变量&#34;不是&#34;字符串文字&#34;。