确定一个对象中有多少个键值发生了变化

Determine how many key values have changed in an object

我有两个相同的对象要比较,它们具有不同的数据类型作为对象属性(数组和对象)。

我想知道有多少属性与第一个不同。请参见下面的示例:

OriginalObject = {
 names : [],
 numbers : [],
 dates :{
  from: null,
  to : null,
 },
 other :{
  from: null,
  to : null,
 },
}

ModifiedObject = {
 names : ['Steven', 'Judy'],
 numbers : [1,5,7],
 dates :{
  from: 15152112512,
  to : null,
 },
 other :{
  from: null,
  to : null,
 },
}

由于姓名、编号和日期已更改,因此所需的输出为:3

我在想也许我可以遍历对象属性并使用 lodash 的 _.isEqual,但我想知道是否有一个简单的简写版本来实现这一点。

我用这个作为解决方案。

 appliedFiltersCount (state) {
        let changedCount = 0
        Object.keys(state.filters).forEach((field) => {
          if (field in state.filters && field in getDefaultState().filters) {
            if (!isEqual(state.filters[field], getDefaultState().filters[field])) {
              changedCount++
            }
          }
        })
        return changedCount
 },

如果你想要一个使用lodash的解决方案,你可以应用_.toPairs() on both of your objects. Then use _.differenceWith()来比较获得的数组,最后得到比较数组的长度:

OriginalObject = {
 names : [],
 numbers : [],
 dates :{
  from: null,
  to : null,
 },
 other :{
  from: null,
  to : null,
 },
}

ModifiedObject = {
 names : ['Steven', 'Judy'],
 numbers : [1,5,7],
 dates :{
  from: 15152112512,
  to : null,
 },
 other :{
  from: null,
  to : null,
 },
}

console.log(_.differenceWith(_.toPairs(OriginalObject), _.toPairs(ModifiedObject), _.isEqual).length);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>