• 两个对象比较内部数据的变化,并返回对应key数组


    • 比较两个对象内部相同key的数据是否发生变化,是则返回变化的key
    • 包含比较内部字符串 内部数组 内部对象
    // obj1 obj2 比对的对象
    // excludeKeys 排除的key
    // 递归调用时的父级key
    // defaultKey 递归判断时仅返回父级key / 父级.子级
    export function compareObjects (obj1, obj2, excludeKeys = [], parentKey = '', defaultKey = true) {
      let keysWithDifferences = [];
      for (let key in obj1) {
        if (!excludeKeys.includes(key) && Array.isArray(obj1[key]) && Array.isArray(obj2[key])) {
          if (!arraysAreEqual(obj1[key], obj2[key], excludeKeys)) {
            if (defaultKey) {
              if (parentKey) {
                keysWithDifferences.push(parentKey);
                break
              } else {
                keysWithDifferences.push(key);
              }
            } else {
              keysWithDifferences.push(parentKey ? `${parentKey}.${key}` : key);
            }
          }
        } else if (!excludeKeys.includes(key) && Object.prototype.hasOwnProperty.call(obj1, key) && Object.prototype.hasOwnProperty.call(obj2, key)) {
          if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object') {
            compareObjects(obj1[key], obj2[key], excludeKeys, key);
          } else if (obj1[key] != obj2[key]) {
            if (defaultKey) {
              if (parentKey) {
                keysWithDifferences.push(parentKey);
                break
              } else {
                keysWithDifferences.push(key);
              }
            } else {
              keysWithDifferences.push(parentKey ? `${parentKey}.${key}` : key);
            }
          }
        }
        // else {
        //   keysWithDifferences.push(parentKey ? `${parentKey}.${key}` : key);
        // }
      }
      for (let key in obj1) {
        if (!excludeKeys.includes(key) && !Object.prototype.hasOwnProperty.call(obj2, key)) {
          if (defaultKey) {
            if (parentKey) {
              keysWithDifferences.push(parentKey);
              break
            } else {
              keysWithDifferences.push(key);
            }
          } else {
            keysWithDifferences.push(parentKey ? `${parentKey}.${key}` : key);
          }
        }
      }
      return keysWithDifferences;
    }
    export function arraysAreEqual (arr1, arr2, excludeKeys) {
      for (let i = 0; i < arr1.length; i++) {
        if (!excludeKeys.includes(arr1[i]) && (typeof arr1[i] === 'object' && typeof arr2[i] === 'object')) {
          if (!deeplyEquals(arr1[i], arr2[i], excludeKeys)) {
            return false;
          }
        } else if (!excludeKeys.includes(arr1[i]) && Array.isArray(arr1[i]) && Array.isArray(arr2[i])) {
          if (!deeplyEquals(arr1[i], arr2[i], excludeKeys)) {
            return false;
          }
        }
        else if (!excludeKeys.includes(arr1[i]) && arr1[i] != arr2[i]) {
          return false;
        }
      }
      return true;
    }
    export function deeplyEquals (obj1, obj2, excludeKeys) {
      let keys1 = Object.keys(obj1);
      for (let key of keys1) {
        if (!excludeKeys.includes(key) && (typeof obj1[key] === 'object' && typeof obj2[key] === 'object')) {
          if (!deeplyEquals(obj1[key], obj2[key], excludeKeys)) {
            return false;
          }
        } else if (!excludeKeys.includes(key) && Array.isArray(obj1[key]) && Array.isArray(obj2[key])) {
          if (!arraysAreEqual(obj1[key], obj2[key], excludeKeys)) {
            return false;
          }
        } else if (!excludeKeys.includes(key) && obj1[key] != obj2[key]) {
          return false;
        }
      }
      return true;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    项目中引入

    import { compareObjects } from "@/utils/validate";
    
    let result = compareObjects(params, params2, ["modifyMaterial", "modifyReason", "createType"])
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    // 示例用法
    let object1 = {a: 1, b: {c: [2, 3], d: 4}, e: 5};
    let object2 = {a: 1, b: {c: [2, 4], d: 4}, f: 6};
    let result = compareObjects(object1, object2, [], true);
    console.log(result); // 返回 ['b.c.1', 'e', 'f']
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    Unexpected tokens (use ‘;‘ to separate expressions on the same line)
    internship:一般的原有项目功能优化的具体步骤
    java计算机毕业设计ssm+vue网络考试信息网站
    Spring Boot 热部署与日志
    浏览器的四种缓存协议
    【SpringBoot篇】再战 登录注册操作
    社区新知 | MindSpore社区和Pair团队携手共进,高效节约医生手动勾画70%的时间成本
    【附源码】计算机毕业设计JAVA移动学习网站
    c 语言基础:L1-049 天梯赛座位分配
    JSON.toJSONString/JSONObject.toJSONString将实体类对象转换成JSON字符串时,多出了params字符串[记录贴]
  • 原文地址:https://blog.csdn.net/l2345432l/article/details/134336541