比较Javascript中的Object并列出差异

时间:2017-12-28 19:06:59

标签: javascript object comparison

我想使用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}

到目前为止,我不是在寻找深度数组对象。

1 个答案:

答案 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>