我试图比较两个对象。我使用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 其属性?
答案 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));
答案 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")
}
}
}
}