13

私は同じ長さとオブジェクトを含む2つのJavaScript配列orig(オブジェクトの元の配列)とupdate(更新されたオブジェクト配列)を持ち、オブジェクトの各ペアの違いを出力したいと思います。オブジェクトの2つのJavaScript配列の違いを見つけるにはどうすればよいですか?

例:

var orig = [{enabled:"true", name:"Obj1", id:3},{enabled:"true", name:"Obj2", id:4}]; 

var update = [{enabled:"true", name:"Obj1", id:3}, {enabled:"true", name:"Obj2-updated", id:4}]; 

出力は次のようになります。name:"Obj2-updated"

私は何かを実装しますが、それは、最適化を必要とする...

for(var prop=0; prop<orig.length; prop++) { 
    for(prop=0; prop<update.length; prop++) { 
    if(orig[prop].enabled != update.enabled) { console.log(update.enabled) } 
    if(orig[prop].name != update[prop].name) { console.log(update[prop].name) } 
    if(orig[prop].id != update[prop].id) { console.log(update[prop].id) } 
    } 
} 
+0

出力は文字列かオブジェクトですか?オブジェクトや文字列を含む配列、または? –

+0

私はあなたのユースケースを知らないが、変更された値のリストしか持たないことは、どのキーとどのオブジェクトに値が変更されたかを知らなくても役に立ちません。あなたはもっと詳細が必要ないと確信していますか?私はあなたの質問に腹を立てようとしているわけではありませんが、変更された値だけを必要とすることについて間違っている場合は、次の質問が何かを予期しようとしています。 –

+0

"Hey、Obj2をObj2に変更しました"という文字列のテキストを作成するには、その出力が必要です。しかし、私が必要とするのは、どのプロパティが変更されたのかを知ることだけです。 – Valip

答えて

12

あなたが鍵をフィルタリングし、更新されたキーで設定した結果を得ることができます。あなたはプロパティが変更されているかを調べるために、元のオブジェクトのプロパティを通過し、更新されたオブジェクトに対してチェックするために、単一のループを使用することができます

var orig = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2", id: 4 }], 
 
    update = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2-updated", id: 4 }], 
 
    difference = []; 
 

 
orig.forEach(function (a, i) { 
 
    Object.keys(a).forEach(function (k) { 
 
     if (a[k] !== update[i][k]) { 
 
      difference.push({ id: update[i].id, key: k, value: update[i][k], index: i }); 
 
     } 
 
    }); 
 
}); 
 

 
console.log(difference);

+0

修正されたオブジェクトを記録する方法があるかどうか教えてください。この場合、{{enabled: "true"、名前: "Obj2-updated"、id:4} ' – Valip

+7

これはあなたが変更された値だけを必要としていると確信すれば、 ](http://stackoverflow.com/questions/39074429/how-to-find-differences-between-two-javascript-arrays-of-objects#comment65497981_39074429)。これまでのところ質問が変更され、必要な戻り値が変更された値から変更された値*および*その値のキーに変更されました。*あなたは変更された値返されるオブジェクト。質問を的確に作成するために質問をする前に5分*を取ってください。 –

+1

@PavelValeriu、もし私が知っていれば、**結果はどのように見えるのでしょうか、私は答えを与えることができます。それで何が必要ですか?オブジェクト、またはインデックスまたはキー/値のペアまたは何ですか? –

6

は、両方のプロパティ名が同一であること、と仮定すると、値は単なるプリミティブです(オブジェクトや配列などはありません)。

Object.keys(orig) 
     .forEach((key) => { 
     if(orig[ key ] !== update[ key ]) { 
      console.log(update[key]); 
     } 
     }); 
+0

'orig [prop] [key]'を使うことはできますか? – Valip

+0

@PavelValeriu何をする?あなたのサンプルコードでは、両方の変数に配列が含まれていると仮定していますが、実際にはオブジェクトです。だからあなたの '。 – Sirko

+0

本質的には同じだが、OPはどの値が違うかを知りたがっているので(キーを参照することなく)、別の回答を投稿する価値はありません。明らかに)値にアクセスするのではなく、['Object.values()'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/values)を使う方が簡単です(これは 'Object.values()'がブラウザに実装されている必要があります)。 –

3

Object.keysを使用してオブジェクトを繰り返し表示します。ような何か:

var orig = { 
 
    enabled: "true", 
 
    name: "Obj1", 
 
    id: 3 
 
}; 
 

 
var update = { 
 
    enabled: "true", 
 
    name: "Obj1-updated", 
 
    id: 3 
 
}; 
 

 
var diff = {}; 
 

 
Object.keys(orig).forEach(function(key) { 
 
    if (orig[key] != update[key]) { 
 
    diff[key] = update[key]; 
 
    }; 
 
}) 
 

 
console.log(diff);

3

var orig = { 
 
    enabled: "true", 
 
    name: "Obj1", 
 
    id: 3 
 
}; 
 

 
var update = { 
 
    enabled: "true", 
 
    name: "Obj1-updated", 
 
    id: 3 
 
}; 
 

 
for (var key in orig) { 
 
    if (orig[key] !== update[key]) { 
 
    console.log(key + ': ' + update[key]); 
 
    } 
 
}

0

あなたは簡潔な方法でそれを行うにはlodashまたはRAMDAのようなライブラリを使用することができます。 Ramdaの場合は、次のようにすることができます。 R.difference(update, orig);

関連する問題