Javascript / JQueryを使用したJSONオブジェクトの違い
-
05-07-2019 - |
質問
JavaScriptには2つの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"}
}
" data"という1つのオブジェクト現在の値があり、「old」と呼ばれる別のオブジェクト。 1秒前と同じ値を持ちます。ネットワークインターフェイスでのデータスループットを計算できるように、値に change のみを含むJSONオブジェクトを出力したいです。
var throughput = {
"eth0":{"Tx":"100","Rx":"100"},
"eth1":{"Tx":"0","Rx":"0"},
"lo":{"Tx":"0","Rx":"0"}
}
JSONデータのトラバースの方法がわからない-任意の数のインターフェイスで使用できます。
誰かが私に手を貸してくれませんか?よろしくお願いします
解決
親および子オブジェクトのプロパティを反復処理できます:
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];
}
}
}
}
他のヒント
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の演習として残しておきます。
たぶんすでに十分に回答されているかもしれませんが、恥知らずなプラグを追加させてください:) JSON(実際にはすべてのJavaScriptオブジェクトまたは配列構造)diff& githubでソースを公開したパッチライブラリ:
https://github.com/benjamine/jsondiffpatch
差分を生成し(JSON形式でフットプリントも小さい)、クライアントを使用できます(テストページを確認)&サーバー側。存在する場合は、 http://code.google.comを使用します。 / p / google-diff-match-patch / 長い文字列の場合は自動的に。
デモページでその仕組みを確認してください。
これは、同様の問題に対処するときに私にとってトリックでした。最初と比較して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
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
});