2017-11-17 27 views
-2

동일한 속성을 포함하는 객체 배열이 2 개 있지만 상황에 따라 1-50 개의 속성을 가질 수 있습니다.JS - 속성 수가 알려지지 않은 객체 배열 2 개 사이의 차이 찾기

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

배열 : 2 : 나는 그 2

배열 사이에 1 차를 얻을 필요가

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

나는 밑줄의 차이 기능을 시도했지만이 시나리오에서 잘 작동하지 않습니다. 객체 키를 가져 와서 정렬하고 객체를 해킹하려고 생각했습니다. 비교할 수는 있지만 원본 형식으로 되돌려 놓아야합니다. 그리고이 배열은 최대 5000 개의 객체를 가질 수 있으므로 값 비싼 것처럼 보입니다.

효과가 있습니까?

편집 : 질문이 Difference between two array of objects in JavaScript인데 그 예제에는 배열을 필터링하는 정적 속성 수가 있습니다. 그것은 사실이 아닙니다. 나는 이름이나 재산의 양을 모른다.

+0

가능한 복제 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

해시 테이블을 가져 와서 키를 먼저 가져온 다음 값을 가져 와서 다른 배열의 해시를 확인하고 결과를 필터링 할 수 있습니다.

이 제안은 두 배열의 대칭 차이를 반환합니다.

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