2015-07-02 5 views
0

Я пытаюсь сравнить два объекта. Я использую socket.io для отправки объекта nodes клиенту.Передача/сравнение по ссылке для объектов javascript

Мои 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. Как скопировать объект и СРАВНЕНИЕ его свойств эффективно?

+0

Вы понимаете, что это не действует Javascript? '' 101 '{} 'должно быть' '101': {}' –

+1

Вы можете сделать глубокую копию объекта, чтобы избежать ссылки: http://stackoverflow.com/questions/122102/what-is-the-most- эффективный путь к клону-объекту –

+0

используют библиотеки, такие как lodash/underscore. – hassansin

ответ

2

Из вашего кода кажется, что проблема не связана с passbyref. Если вы объявляете oldNodes вне вашей функции и затем назначаете ее var в инструкции if, oldNodes не будут определены в блоке else. Это может быть то, что вы ищете?

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

Я не могу написать 'oldNodes = nodes;' Он просто скопирует ссылку на объект «узлы». Поэтому, когда я что-то меняю на 'oldNodes', объект' nodes' также будет реализован. –

+1

Вы протестировали это? Узлы, которые попадают вам в код socketio, относятся к ws и не относятся ни к чему другому. – noveyak

+0

@ J.Jay, noveyak на 100% прав, +1 –

2

Вы можете попробовать:

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

Пожалуйста, добавьте некоторое объяснение. – Nilambar

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

Предположим, что я вношу некоторые изменения в oldNodes. Будет ли изменен newObj сразу после моего изменения на oldNodes? Потому что есть другие части программы (другие объекты, которые меняются в соответствии с изменением newObj), которые зависят от этого newObj, –

+0

@ J.Jay No, Never .... Почему вы не можете попробовать? –

Смежные вопросы