通过引用传递/比较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
第一次接收时创建它的副本。将其保存到变量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")
}
}
}
}
相关文章:
- 无法比较javascript变量
- 比较javascript中的浮动并更改最高浮动的颜色
- 比较Javascript中的两个字符串时出错
- 比较javascript数组中的数值
- 比较 JavaScript 中的值
- 如何比较 JavaScript 格式为 2011-jan-21 的两个日期
- 是否有必要使用 === 来比较 Javascript 中的字符串,或者 == 就足够了
- 使用Jquery比较Javascript中的两个列表/表
- 比较javascript中的两个数组
- 如何在单元测试中比较JavaScript对象
- 比较javascript/jquery中的两个字符串
- 比较Javascript中的两个数组
- 比较javascript中的数组时出错
- 比较javascript中的函数指针
- 无法比较 javascript 数组中的两个值
- 如何仅针对某些属性比较 JavaScript 中的对象
- 循环并比较JavaScript对象
- 比较 JavaScript 中的变量
- 比较Javascript/Jquery中的确切结果
- 比较 JavaScript 日期对象