我想使用javascript比较2个对象,并列出对象之间的差异。我看到有深度对象差异的库可以让我做类似的事情,但我正在寻找甚至列出从某些东西变为null或null的东西的东西。每当我尝试使用任何库时,我都能列出更改,但每当我尝试将null与任何内容进行比较时,它都会返回null。
所以,如果我有2个像
这样的对象a: {name: null, date: 12/28/2017, dept: sales}
b: {name: john, date: 12/28/2017, dept: technology}
结果对象应为
c: {name: john, dept: technology}
到目前为止,我不是在寻找深度数组对象。
答案 0 :(得分:0)
你可以这样做。
将权利与左对象进行比较,因此如果右侧缺少某个属性,则会在Missing
中包含该属性,如果左侧缺少该属性,则会将其包裹在Extra
< / p>
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>