Разница в объектах JSON, использующих Javascript / JQuery - PullRequest
15 голосов
/ 29 июля 2009

У меня есть два объекта JSON в Javascript, идентичные за исключением числовых значений. Это выглядит так:

var data = {
  "eth0":{"Tx":"4136675","Rx":"13232319"},
  "eth1":{"Tx":"4","Rx":"0"},
  "lo":{"Tx":"471290","Rx":"471290"}
}

var old = {
  "eth0":{"Tx":"4136575","Rx":"13232219"},
  "eth1":{"Tx":"4","Rx":"0"},
  "lo":{"Tx":"471290","Rx":"471290"}
}

Один объект с именем «data» имеет текущие значения, другой объект с именем «old» имеет те же значения, что и 1 секунду назад. Я хотел бы вывести объект JSON только со значениями change , чтобы я мог рассчитать пропускную способность данных на сетевых интерфейсах.

var throughput = {
  "eth0":{"Tx":"100","Rx":"100"},
  "eth1":{"Tx":"0","Rx":"0"},
  "lo":{"Tx":"0","Rx":"0"}
}

Я не уверен, как обходить данные JSON - это может быть для любого количества интерфейсов.

Может кто-нибудь помочь мне? Заранее спасибо

Ответы [ 5 ]

14 голосов
/ 29 июля 2009

Основная предпосылка для перебора объектов в JavaScript выглядит примерно так:

var whatever = {}; // object to iterate over
for ( var i in whatever )
{
  if ( whatever.hasOwnProperty( i ) )
  {
     // i is the property/key name
     // whatever[i] is the value at that property
  }
}

Исправить чекер не будет слишком сложно. Вам понадобится рекурсия. Я оставлю это как упражнение для вас или другого SOER.

8 голосов
/ 09 февраля 2012

Может быть, это уже достаточно ответили, но позвольте мне добавить мою бесстыдную вилку :) Библиотека JSON (фактически любой объект javascript или структура массива) diff & patch, которую я открываю на github:

https://github.com/benjamine/jsondiffpatch

он генерирует diff (также в формате JSON и с небольшим размером), который вы можете использовать на стороне клиента (проверьте тестовую страницу) и на стороне сервера, и, если присутствует, автоматически использует http://code.google.com/p/google-diff-match-patch/ для длинных строк .

проверьте страницу DEMO , чтобы увидеть, как она работает.

7 голосов
/ 29 июля 2009

Вы можете перебирать свойства родительского и дочернего объекта:

var diff = {};
for(var p in data){
  if (old.hasOwnProperty(p) && typeof(data[p]) == 'object'){
    diff[p] = {};
    for(var i in data[p]){
      if (old[p].hasOwnProperty(i)){
        diff[p][i] = data[p][i] - old[p][i];
      }
    }
  }
}
4 голосов
/ 14 сентября 2011

Это помогло мне, столкнувшись с подобной проблемой. Он получает разницу в секунду по сравнению с первым.

var first  = originalObj;
var second = modifiedObj;
var diff   = {};

var differ = function(first, second, result) {
    var i = 0;
    for (i in first) {
        if (typeof first[i] == "object" && typeof second[i] == "object") {
            result[i] = differ(first[i], second[i], {});
            if (!result[i]) delete result[i];
        } else if (first[i] != second[i]) {
            result[i] = second[i];
        }
    }
    return isEmpty(result) ? undefined : result;
}

differ(old_conf, new_conf, diff);

Код - это особый случай, но вы получите общее представление: P

0 голосов
/ 06 июля 2015

Для этого вы можете использовать модуль обхода объекта, например nervgh/object-traverse.

var result = {}
Object.traverse(old, function(node, value, key, path) {
  var resultObject = result
  for(var n=0; n<path.length-1; n++) {
    resultObject = resultObject[path[n]]
  }
  resultObject[key] = value
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...