js比较两个JSON对象,返回变化值

废话不多说,直接上干货。

  let utils = {
      /**
      * 比较两个json(新json与老json)的不同,并返回 不同时的旧值(old_val)和新值(new_val)
      * @param {*} json1 老json
      * @param {*} json2 新json 
      */
      diff(json1, json2) {
        if (!json1 || this.isEmptyObject(json1) || !json2 || this.isEmptyObject(json2)) {
          return null;
        }
        let diffRes = {
          old_val: {},
          new_val: {}
        };
        for (let k in json2) {
          // 判断数据类型是否一致
          if (this.getTypeByObj(json2[k]) === this.getTypeByObj(json1[k])) {
            // 比较 “Array”和“Object”类型
            if (this.getTypeByObj(json2[k]) === 'Array' || this.getTypeByObj(json2[k]) === 'Object') {
              const diffData = this.diff(json1[k], json2[k]);
              if (!this.isEmptyObject(diffData)) {
                diffRes.old_val[k] = diffData.old_val;
                diffRes.new_val[k] = diffData.new_val;
              }
            } else if (json1[k] !== json2[k]) { // 比较其他类型数据
              diffRes.old_val[k] = json1[k];
              diffRes.new_val[k] = json2[k];
            }
          } else {
            diffRes.old_val[k] = json1[k];
            diffRes.new_val[k] = json2[k];
          }
        }
        // 若没有变化,返回null
        if (this.isEmptyObject(diffRes.old_val) || this.isEmptyObject(diffRes.new_val)) {
          return null;
        }
        return diffRes;
      },
      /**
       * 获取数据类型
       * @param {*} obj 
       */
      getTypeByObj(obj) {
        return Object.prototype.toString.call(obj).match(/^\[object ([a-zA-Z]*)\]$/)[1];
      },
      /**
       * 判断是否是空对象
       * @param {*} obj 
       */
      isEmptyObject(obj) {
        for (var key in obj) {
          return false;
        };
        return true;
      }
    }
    let obj1 = {
      name: 'jack',
      age: 18,
      title: '这是标题',
      lv2: {
        tip: '这是二层提示',
        lv3: {
          noC: 'noC',
          msg: "这是三层msg"
        }
      }
    }
    let obj2 = {
      name: 'jack',
      age: 188,
      title: '这是标题1',
      lv2: {
        tip: '这是二层提示',
        lv3: {
          noC: 'noC',
          msg: "这是三层msg1"
        }
      },
      no: '这是obj1没有的'
    }
    console.log(utils.diff(obj1, obj2));
    /**
      {
        "old_val": {
          "age": 18,
          "title": "这是标题",
          "lv2": {
            "lv3": {
              "msg": "这是三层msg"
            }
          }
        },
        "new_val": {
          "age": 188,
          "title":
            "这是标题1",
          "lv2":
          {
            "lv3":
              { "msg": "这是三层msg1" }
          },
          "no": "这是obj1没有的"
        }
      }
    */

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值