2017-11-17 9 views
-2

同じプロパティを含む2つのオブジェクトの配列がありますが、状況によっては1-50のプロパティを持つことができます。JS - プロパティの数が不明なオブジェクトの2つの配列間の差異を見つける

[ 
    { 
    "prop1": 1, 
    "prop2": 2 
    }, 
    { 
    "prop1": 4, 
    "prop2": 4 
    }, 
    { 
    "prop1": 3, 
    "prop2": 7 
    }, 
    { 
    "prop1": 1, 
    "prop2": 3 
    } 
] 

は、アレイ2:

[ 
    { 
    "prop1": 1, 
    "prop2": 2 
    }, 
    { 
    "prop1": 4, 
    "prop2": 4 
    } 
] 

私はアンダースコアの差関数を試みたが、それは、このシナリオではうまく動作しません。私はそれらの2

アレイ1の間の差を取得する必要があります。私はオブジェクトキーを取得し、それをソートし、オブジェクトをハッシングすることを考えていました。私はそれを比較できますが、元の形式に戻す必要があります。これらのアレイは最大5000のオブジェクトを持つことができるため、コストがかかるようです。

効果的なソリューションはありますか?

編集:私は質問Difference between two array of objects in JavaScriptを見ましたが、その例では配列をフィルタリングする静的な数のプロパティがあります。そうではありません。私は名前やプロパティの量を知らない。

+0

[JavaScriptでのオブジェクトの2つの配列間の差異]の可能な重複(https://stackoverflow.com/questions/21987909/difference-between-two-array-of-objects- in-javascript) – rahulsm

+0

この回答を参考にしてください[link](https://stackoverflow.com/a/21988185/6556397) – rahulsm

+0

希望の結果を追加してください。プロパティは常に同じですか? –

答えて

1

ハッシュテーブルをとり、最初にキーを取得してから値を取得し、他の配列のハッシュをチェックして結果をフィルタリングすることができます。

この提案は、2つの配列の対称性の違いを返します。

function getDifference(a, b) { 
 
    function getKeyValue(object) { 
 
     var keys = Object.keys(object).sort(); 
 
     return { 
 
      key: keys.join('|'), 
 
      value: keys.map(function (k) { return object[k]; }).join('|') 
 
     }; 
 
    } 
 

 
    function setHash(hash, kv) { 
 
     hash[kv.key] = hash[kv.key] || {}; 
 
     hash[kv.key][kv.value] = true; 
 
    } 
 

 
    function isHash(hash, kv) { 
 
     return hash[kv.key] && hash[kv.key][kv.value]; 
 
    } 
 

 
    var hashA = Object.create(null), 
 
     hashB = Object.create(null), 
 
     result; 
 

 
    b.forEach(function (o) { 
 
     var kv = getKeyValue(o); 
 
     setHash(hashB, kv); 
 
    }); 
 

 
    return Array.prototype.concat(
 
     [], 
 
     array1.filter(function (o) { 
 
      var kv = getKeyValue(o); 
 
      setHash(hashA, kv); 
 
      return !isHash(hashB, kv); 
 
     }), 
 
     array2.filter(function (o) { 
 
      var kv = getKeyValue(o); 
 
      return !isHash(hashA, kv); 
 
     }) 
 
    ); 
 
} 
 

 
var array1 = [{ prop1: 1, prop2: 2 }, { prop1: 4, prop2: 4 }, { prop1: 3, prop2: 7 }, { prop1: 1, prop2: 3 }, { prop2: 3 }], 
 
    array2 = [{ prop1: 1, prop2: 2 }, { prop1: 4, prop2: 4 }, { prop1: 4 }]; 
 

 
console.log(getDifference(array1, array2));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

魅力が好き! – CountGradsky

関連する問題