2017-12-28 67 views
0

javascript를 사용하여 2 개의 개체를 비교하고 개체 간의 차이점을 나열하고 싶습니다. 비슷한 것을 할 수있게 해주는 라이브러리 deep-object-diff가 있다는 것을 알았지 만 값이 null에서 null로 바뀐 것을 나열하는 무언가를 찾고 있습니다. 라이브러리를 사용하려고 할 때마다 변경 사항을 나열 할 수 있지만 null을 다른 것으로 비교하려고 할 때마다 null이 반환됩니다. 내가자바 스크립트에서 개체 비교 및 ​​차이점을 나열하십시오

a: {name: null, date: 12/28/2017, dept: sales} 
b: {name: john, date: 12/28/2017, dept: technology} 

추천 객체가있는 경우

그래서, 생성 된 객체는 지금의 깊은 배열 객체 비교를 찾고 있지 않다

c: {name: john, dept: technology} 

해야한다.

+3

안녕하세요. 질문을 편집하여 시도한 코드 ([mcve])를 추가 할 수 있습니까? – Andy

+0

개체 중 하나를 반복하면서 각 개체의 속성을 다른 개체의 해당 속성과 비교합니다. – Barmar

답변

0

다음과 같이 할 수 있습니다.

권리가 좌측 오브젝트에 비해 너무되는 속성은 속성 Extra

const left = {name: null, date: '12/28/2017', dept: 'sales', one: 'leftExtra', three: 'leftExtra2'} 
 
const right = {name: 'john', date: '12/28/2017', dept: 'technology', two: 'rightExtra'} 
 

 
const defined = thing => typeof thing !== 'undefined' 
 

 
const compare = (left, right) => { 
 
    const leftKeys = Object.keys(left) 
 
    const rightKeys = Object.keys(right) 
 
    const keys = Array.from(new Set([...leftKeys, ...rightKeys])) 
 
    
 
    return keys.reduce((comparison, key) => { 
 
    if (defined(left[key]) && !defined(right[key])) { 
 
     comparison.missing[key] = left[key] 
 
    } 
 
    else if (!defined(left[key]) && defined(right[key])) { 
 
     comparison.extra[key] = right[key] 
 
    } 
 
    else if (left[key] !== right[key]) { 
 
     comparison.different[key] = right[key] 
 
    } 
 
    else { 
 
     comparison.same[key] = left[key] 
 
    } 
 
    return comparison 
 
    }, { same: {}, different: {}, missing: {}, extra: {} }) 
 
} 
 

 
console.log(
 
    compare(left, right) 
 
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
에서 그 래핑한다 왼쪽에서 누락되는 경우가 Missing 래핑 될 오른쪽에서 누락 된 경우

+0

고맙습니다. synthet1c. 위에 설명 된 스 니펫을 사용하고 나에게 도움이되었습니다. – user9150507

+0

기쁘다. – synthet1c