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

Passing/Comparing by reference for javascript objects

本文关键字:比较 javascript 对象 引用      更新时间:2023-09-26

我正在尝试比较两个对象。我使用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进行比较并输出哪个属性已更改。

例如如果它接收到CCD_,它应该打印(console.log)CCD_。

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。如何有效地复制对象及其属性?

从您的代码来看,问题似乎与passbyref无关。如果在函数外声明oldNodes,然后在If语句内用var赋值,则不会在else块中定义oldNodes。这可能就是你想要的?

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

您可以尝试:

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

1)简单克隆:

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

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

正如您所说的

对于复制,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")
            }
       }
    }
}