【问题标题】:Given two javascript objects, how can I determine what field(s) were changed?给定两个 javascript 对象,我如何确定更改了哪些字段?
【发布时间】:2017-04-12 12:17:06
【问题描述】:

假设我有两个版本:

let oldObj = {
    name: "john",
    location: "usa",
    age: 43
}

let newObj = {
    name: "john",
    location: "usa",
    age: 44
}

age的情况下发生了变化。

【问题讨论】:

  • 你可以使用“代码”来“比较”它们
  • 首先,将new 更改为其他内容,并在位置行后添加逗号。然后就可以看到stackoverflow.com/a/8432188/3885376了。

标签: javascript


【解决方案1】:

假设您只想跟踪(原始值的)更改而不是添加/删除,您可以迭代一个对象中的值并与另一个对象中的相应值进行直接比较:

let oldObj = {
    name: "john",
    location: "usa",
    age: 43
}

let newObj = {
    name: "john",
    location: "usa",
    age: 44
}

let changes = Object
  .entries(oldObj)
  .filter(([key, value]) => value !== newObj[key])

console.log(changes)

如果你不关心值,你可以只过滤键:

let oldObj = {
    name: "john",
    location: "usa",
    age: 43
}

let newObj = {
    name: "john",
    location: "usa",
    age: 44
}

let changes = Object
  .keys(oldObj)
  .filter(key => oldObj[key] !== newObj[key])

console.log(changes)

如果要添加/删除,可以先确定key数量较多的对象,同上:

let oldObj = {
    name: "john",
    location: "usa",
    age: 43
}

let newObj = {
    name: "john",
    location: "usa",
    age: 44,
    addition: 'test'
}

let [larger, smaller] = Object.keys(oldObj).length > Object.keys(newObj).length
  ? [oldObj, newObj]
  : [newObj, oldObj]

let changes = Object
  .entries(larger)
  .filter(([key, value]) => !smaller.hasOwnProperty(key) || value !== smaller[key])

console.log(changes)

【讨论】:

    【解决方案2】:

    Lodash 万岁!

    var changes = _.reduce(oldObj, function(result, value, key) {
        return _.isEqual(value, newObj[key]) ?
            result : result.concat(key);
    }, []);
    console.log(changes);
    

    【讨论】:

      【解决方案3】:

      您应该做的第一件事是编辑您的问题,并将 new 替换为其他内容,因为 new 是 javascript 中的关键字,用于与构造函数一起创建该特定构造函数的实例。

      let old = {
          name: "john",
          location: "usa",
          age: 43
      }
      
      let _new = {
          name: "john",
          location: "usa",
          age: 44
      }
      for ( let j in old ) {
          if ( old[j] !== _new[j] ) {
              console.log(`${old[j]} is not ${_new[j]}`);
          }
      }
      

      下面的代码循环通过old对象,j的内容将是旧对象的键,if语句使用old[j]获取j键的内容(同样适用于@ 987654326@ ),if 语句还检查_new[j]_old[j] 的内容和类型是否相同。如果您不关心类型,则应删除 if 语句中的等号之一

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 2016-04-06
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多