Разница в объектах JSON с использованием Javascript/JQuery
У меня есть два объекта 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"}
}
Один объект, называемый "данные", имеет текущие значения, другой объект, называемый "старый", имеет те же значения с 1 секунды назад. Я хотел бы вывести объект JSON только с изменением значений, чтобы я мог рассчитать пропускную способность данных на сетевых интерфейсах.
var throughput = {
"eth0":{"Tx":"100","Rx":"100"},
"eth1":{"Tx":"0","Rx":"0"},
"lo":{"Tx":"0","Rx":"0"}
}
Я не уверен, как обойти данные JSON - это может быть для любого количества интерфейсов.
Кто-нибудь, пожалуйста, протяните мне руку? Спасибо заранее
Ответы
Ответ 1
Вы можете выполнять итерацию через свойства родительского и дочернего объектов:
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];
}
}
}
}
Ответ 2
Основная предпосылка для итерации объектов в 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.
Ответ 3
Возможно, он уже достаточно ответил, но позвольте мне добавить мой бесстыдный плагин:)
JSON (фактически любой объект javascript или структура массива) diff и библиотека патчей, которые я открываю в github:
https://github.com/benjamine/jsondiffpatch
он генерирует diff (также в формате JSON и с небольшим размером), который вы можете использовать для клиента (проверьте тестовую страницу) и на стороне сервера, и если он присутствует, он использует http://code.google.com/p/google-diff-match-patch/ для длинных строк автоматически.
просмотрите страницу DEMO, чтобы увидеть, как она работает.
Ответ 4
Это помогло мне справиться с подобной проблемой. Он получает различия во втором по сравнению с первым.
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
Ответ 5
Для этого вы можете использовать модуль обхода объекта, например 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
});