jQuery/JavaScript JSONオブジェクトの比較

2つのjsonオブジェクトのセットを比較することは可能ですか?私が持っているのは、jquery $
post()を介してJSONオブジェクトをポーリングするスクリプトです。私がしたいのは、ちょうどポーリングされたオブジェクトを取り出し、それを保存されたものと比較することです。どこから変更があっても、それが格納されたオブジェクトに適用されるか、または置き換えられる(いずれかの方法)が、私はUIの観点からJSONオブジェクトの変更をシームレスに適用します。
2.私はこれをしたいと思っています。なぜなら、UXの観点から見ると基本的には * *のように見えます。

私は2つのオブジェクトの間に違いがある場合は、その違いに固有のUIを編集する関数を呼び出すことができます。

ベストアンサー

私がしたいのは、ちょうどポーリングされたオブジェクトを取り出し、それを保存されたものと比較することです。どこから変更があった場合は、保存されたオブジェクトに適用するか、それを置き換えます(いずれかの方法で)

本当にシンプルな「どのように変更されましたか?はい/いいえ」解決策があれば、変更された場合は前のオブジェクトを新しいオブジェクトに置き換えます(引用した部分に基づいて)それを解析する前にJSONレスポンスを保存することができます。つまり、ウェブサーバーが送信する文字列形式で保存します。次に、次の応答が来たら、新しい文字列と古い文字列を比較します。それらが異なる場合(または最初のリクエストの場合)、JSONを解析し、適切に表示するために処理します。もちろんこれは、サーバー側のコードがJSON文字列を一貫した形式(プロパティの順序を変更しないなど)で作成していることを前提としています。

既に(解析された)オブジェクトを持っていると仮定した場合、
isEqual(a、b)関数は実際にネストされたオブジェクトや配列などのプロパティに対処する必要があります。これは再帰的に行うことができ、
trueまたはfalseを返しますが、
getDifferences(a、b)関数は、ネストされたオブジェクト内の違いをどのように報告するかを混乱させるでしょう。以下の簡単な例を考えてみましょう。

old: {"mum" : "Maria", "dad" : "Pierre", "kids" : ["Joe", "Mike", "Louisa"] }
new: {"mum" : "Julie", "dad" : "Pierre", "kids" : ["Joe", "Mary"] }

違いは {"mum": "Julie"、 "kids":["Mary"]} ですか?
“ママ”は変更され、 “子供”のリストは変更されましたが、 “マイク”が “マリア”に変更されているか、 “マイク”と “ルイーザ”が
“メアリー” ?おそらく、これは新しい値であるため、 "kids":["Joe"、 "Mary"]
である必要があります。あなたはどのように削除を指示しますか?それは私があなたがその違いをどのように扱いたいと思うかわからない、頭の上の最初の例です。すばやく悪化する可能性があります。「子供」配列に文字列ではなくオブジェクトが含まれていて、家族ツリー全体を表す場合はどうでしょうか?新しい
“mum”プロパティが ["Maria"、 "Julie"]
(ステップ・ペアレントなどを許可する)の場合はどうなりますか?

あなたの特定のデータについて、あなたが1次元オブジェクトしか持っていないことを知っているなら、次のような簡単なことができます:

function getDifferences(oldObj, newObj) {
   var diff = {};

   for (var k in oldObj) {
      if (!(k in newObj))
         diff[k] = undefined; //property gone so explicitly set it undefined
      else if (oldObj[k] !== newObj[k])
         diff[k] = newObj[k]; //property in both but has changed
   }

   for (k in newObj) {
      if (!(k in oldObj))
         diff[k] = newObj[k];//property is new
   }

   return diff;
}

ネストされたオブジェクトを許可するための上記の最も単純な変更は、プロパティがオブジェクト/配列である場合、それがどのように異なっているかだけを気にして、どの「サブプロパティ」が変更されたかを正確に報告することはない。もしそうなら、単に上記の関数を取って変更してください:

else if (oldObj[k] !== newObj[k])

else if (!isEqual(oldObj[k],newObj[k]))

isEqual()は、ウェブ上に浮かぶ多数の比較関数の1つです。をStackOverflow
に追加します。

(Note: I haven’t bothered with .hasOwnProperty()
above because I assume that objects that were returned に an Ajax
request as JSON will not be inheriting properties from a proにtype
chain. Similarly an isEqual() function for this
purpose wouldn’t need に worry about properties being functions, it
only needs に worry about what is valid in a JSON string.)

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です