Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将一个对象的选定特性值复制到另一个对象_Javascript_Object_Copy - Fatal编程技术网

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

Javascript 将一个对象的选定特性值复制到另一个对象,javascript,object,copy,Javascript,Object,Copy,我有两个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}}; 我只想把obj_b的“x和y值”复制到obj_a,如果它们不同的话。 比如说, 如果obj_b={'p1':{x:200,y:200},'p2':{x:300,y:400}, 最终的对象

我有两个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}};
我只想把obj_b的“x和y值”复制到obj_a,如果它们不同的话。 比如说,

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

最终的对象a将是
obj_a={'p1':{x:200,y:200,z:100},'p2':{x:300,y:400,z:300}。完全忽略obj_a的属性“z”

因此,我写了以下内容:

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;
        }
    }
}
功能不同(a、b){
var aProps=Object.getOwnPropertyNames(a);
var bProps=Object.getOwnPropertyNames(b);
对于(变量i=0;i

但是使用obj_a[prop].propName复制时出现问题,因为我只有在
console.log(obj_a[prop].propName);
时才未定义。当我尝试
console.log(obj_a[p1].x);
时,输出是旧值:“200”.有人能告诉我吗?

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

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


您应该使用[prop][propName]
对象。
对象[prop].propName
对象[prop][“propName”]
相同,这意味着它将搜索名称为“propName”的属性

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

您想要的是将“propName”视为“字符串变量”,而不是“字符串文字”

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