2017-12-28 77 views
0

javascriptを使用して2つのオブジェクトを比較し、オブジェクト間の違いをリストしたいと思います。私は同様のことをさせてくれるライブラリdeep-object-diffがあることを知っていますが、値がnullからnullに変わったものを何かに探し出すものを探しています。任意のライブラリを使用しようとするたびに、変更を列挙できますが、nullと何かを比較しようとするたびに、nullが返されます。Javascriptでオブジェクトを比較し、相違点をリストしてください

私は

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

のような2オブジェクトを持っているのであれば、得られるオブジェクトは、私は今のように深い配列オブジェクトの比較のために見ているわけではない

c: {name: john, dept: technology} 

でなければなりません。

+3

ようこそ。試したコード([mcve])を質問を編集して追加できますか? – Andy

+0

オブジェクトの1つをループし、各プロパティを他のオブジェクトの対応するプロパティと比較します。 – 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

関連する問題