通过引用传递/比较javascript对象

时间:2015-07-02 05:54:20

标签: javascript node.js socket.io pass-by-reference

我试图比较两个对象。我使用socket.io将nodes对象发送到客户端。

我的server.js

var nodes = {'101':{ID:'101',x:100,y:200},
             '102':{ID:'102',x:200,y:200}};
socket.emit('message', nodes);

在我的客户端,我只想在第一次收到时创建对象nodes的副本。将其保存到变量oldNodes,并在下次套接字收到nodes对象时,与oldNodes进行比较并输出已更改的属性。

,例如,如果收到var nodes = {'101':{ID:'101',x:100,y:200},'102':{ID:'102',x:200,y:300}};, 它应该打印(console.log)nodes[102].y is changed

client.html

socket.on('message', function(nodes){
    if (oldNodes == undefined){
        var oldNodes = nodes;
   }
   else{
       //compare oldNodes & nodes
       //print result
  }
});

对于复制,var oldNodes = nodes;不是我想要的,因为javascript将对象作为参考传递。因此,即使oldNodes & nodes具有相同的内容,(oldNodes == nodes)也会生成false。如何有效地复制对象和 COMPARE 其属性?

4 个答案:

答案 0 :(得分:2)

从您的代码中看起来似乎问题不是与passbyref有关。如果在函数之外声明oldNodes,然后在if语句中为var赋值,则不会在else块中定义oldNodes。这可能就是你要找的东西?

if (oldNodes == undefined){
    oldNodes = nodes;
}

答案 1 :(得分:2)

您可以尝试:

if (typeof oldNodes === 'undefined') {
    // use deep copy of Jquery
    var oldNodes = jQuery.extend(true, {}, nodes); 
} else {
   //compare oldNodes vs. nodes
   //print result
}

答案 2 :(得分:1)

1)简单克隆:

var oldNodes = JSON.parse(JSON.stringify(nodes));

2)使用此库比较:https://github.com/benjamine/jsondiffpatch

答案 3 :(得分:1)

正如你所说

复制时,var oldNodes = nodes;不是我想要的,因为javascript传递对象作为参考。

这不是这种情况:

您的代码是正确的,只需使用它,您就不会遇到任何参考问题,因为每次从套接字接收数据时它都是新对象

这是您需要的最终代码,试一试

var oldNodes = undefined
socket.on('message', function(nodes){
    createFirstTime_And_CompareElse(nodes)
});


var createFirstTime_And_CompareElse = function(newObj) {
    if (oldNodes == undefined){
        oldNodes = newObj;
    }
    else{
        //compare oldNodes & newObj
        //print result
        for(each in oldNodes) {
            for(subEach in oldNodes[each])
            if(oldNodes[each][subEach] != newObj[each][subEach]) {
                console.log("newObj[" + each + "]" + "[" + subEach + "] is changed")
            }
       }
    }
}