2009-07-29 14 views
15

Javascriptに2つのJSONオブジェクトがありますが、数値は同じです。それは次のようになります。「データ」と呼ばれるJavascript/JQueryを使用したJSONオブジェクトの相違

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データを横断については移動するかどうかはわかりません - それは、任意の数のインターフェイスのためである可能性があります。

誰も私に手を貸してもらえますか? JavaScriptでのオブジェクトを反復処理のための事前

+0

良い答えもここが見つかりました:[?どのようJavaScriptオブジェクト間の違いをマッピングすることができます](http://codereview.stackexchange.com/questions/11412/how-can-you-map-the-クライアント側の比較のために、おそらくhttp://tlrobinson.net/projects/javascript-fun/jsondiff/のjavascript-objects/11580#11580)の – laggingreflex

+0

が役に立つかもしれません。 – Veverke

答えて

7

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

基本的な前提でのおかげでとても

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のための練習として残します。あなたが親と子オブジェクトのプロパティを繰り返し処理することができます

4

これは、同様の問題に対処する私のためのトリックを行いました。最初のものと比較して2番目の違いが得られます。

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

8

多分それはすでに十分な答えだが、しかし、私は私の恥知らずなプラグ:) A JSON(実際には任意のJavaScriptを追加してみましょうオブジェクトまたは配列構造)の差分&パッチライブラリは、私はgithubのにオープンソース化:それはまた、JSON形式で(差分を生成

https://github.com/benjamine/jsondiffpatch

、とあなたは、CL使用できる小さなフットプリント)、と(テストページを確認してください)&サーバー側にあり、存在する場合は、長い文字列に対して自動的にhttp://code.google.com/p/google-diff-match-patch/を使用します。

DEMOページを確認して、その動作を確認してください。

+0

+1洗練されたjson diffアルゴリズム、例えば、文字列の属性を使って、完全な* before *と* after *文字列を使用するか、結果のdiffの長さに応じてstringをdiff **内部で行うかを決定します(私は仮定します)。 –

+0

はい、テキストの差分は、2つの長さ(設定可能な長さ)の文字列が見つかった場合に行われます(diffサイズを小さくするため、またファジー・パッチを許可するため)。 – Benja

0

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 
}); 
関連する問題