繁体   English   中英

通过/比较javascript对象的引用

[英]Passing/Comparing by reference for javascript objects

我正在尝试比较两个对象。 我使用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第一次收到时创建对象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 changednodes[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 如何复制对象并有效地比较其属性?

从您的代码看来,问题似乎与passbyref无关。 如果您在函数外部声明oldNodes,然后在if语句中为其分配var,则oldNodes将不会在else块中定义。 这可能是您在寻找什么?

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 =节点; 这不是我想要的,因为javascript传递对象作为参考。

这里不是这种情况:

您的代码是正确的,随它去吧,因为每次从套接字接收到的数据都是一个新Object ,您就不会遇到任何参考问题

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

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")
            }
       }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM