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

文章介绍了如何使用JavaScript函数compareObjects和arraysAreEqual/deeplyEquals来比较两个对象,检测它们在指定键排除列表下的数据变化,包括数组和嵌套对象。示例展示了如何在不忽略部分键的情况下找出不同或新增的键路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 比较两个对象内部相同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;
}

项目中引入

import { compareObjects } from "@/utils/validate";

let result = compareObjects(params, params2, ["modifyMaterial", "modifyReason", "createType"])


// 示例用法
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']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值