Pergunta

Eu tenho dois objetos JSON em Javascript, idênticos, exceto para os valores numéricos. Parece que este:

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"}
}

Um objeto chamado "data" tem os valores atuais, outro objeto chamado "velho" tem os mesmos valores de 1 segundo atrás. Eu gostaria de saída de um objeto JSON apenas com o mudança em valores para que eu possa calcular dados rendimento nas interfaces de rede.

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

Eu não sei como proceder para percorrer os dados JSON - poderia ser para qualquer número de interfaces

.

Alguém por favor pode me dar uma mão? Agradecemos antecipadamente

Foi útil?

Solução

É possível percorrer as propriedades pai e objeto filho:

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];
      }
    }
  }
}

Outras dicas

A premissa básica para a iteração sobre os objetos em JavaScript é como assim

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
  }
}

Corrigindo-se um verificador não seria muito difícil. Você vai precisar de recursão. Vou deixar isso como um exercício para você ou outro SOER.

Talvez ele já respondeu o suficiente, mas deixe-me acrescentar minha tomada desavergonhado :) Um JSON (na verdade, qualquer objeto JavaScript ou estrutura de matriz) dif & remendo biblioteca I código aberto no github:

https://github.com/benjamine/jsondiffpatch

gera diffs (também em formato JSON, e com uma pegada pequena), que você pode usar o cliente (verifique a página de teste) e do lado do servidor, e se estiver presente, ele usa http://code.google.com/p/google-diff-match-patch/ para longas seqüências automaticamente .

verifique a página DEMONSTRA para ver como ele funciona.

Este fez o truque para mim quando se lida com um problema semelhante. Ela recebe as diferenças em segundo em relação ao primeiro.

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);

código é um pouco de um caso especial, mas você começa a idéia geral: P

Você pode usar um módulo de passagem de objeto como nervgh/object-traverse para fazer isso.

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
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top