[英]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 changed
了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
。 如何复制对象并有效地比较其属性?
从您的代码看来,问题似乎与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.