You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断元素属性相同但顺序不同的两个Object数组是否相等

判断两个对象数组是否包含属性完全相同的对象(顺序无关)

要判断两个数组是否包含属性完全一致的对象(不管元素顺序),可以根据你的场景选择以下几种原生JavaScript方案:

方案1:JSON.stringify + 排序(适合纯数据对象)

如果数组中的对象都是纯数据类型(无函数、undefined、Symbol等JSON无法序列化的内容),可以通过将对象转为字符串后排序比较:

const array1 = [{id:1,name:'john'},{id:2,name:'wick'}];
const array2 = [{id:2,name:'wick'},{id:1,name:'john'}];

const isEqualArrays = (arr1, arr2) => {
  // 长度不一致直接返回false
  if (arr1.length !== arr2.length) return false;
  
  // 将每个对象转为JSON字符串,再排序数组
  const sortedArr1 = arr1.map(item => JSON.stringify(item)).sort();
  const sortedArr2 = arr2.map(item => JSON.stringify(item)).sort();
  
  // 逐位比较排序后的字符串数组
  return sortedArr1.every((str, idx) => str === sortedArr2[idx]);
};

console.log(isEqualArrays(array1, array2)); // 输出: true

注意:如果对象包含undefined、function、Symbol等类型,JSON.stringify会忽略或转换这些值,导致比较结果不准确。

方案2:自定义对象深比较(通用场景)

如果需要处理嵌套对象、特殊数据类型,或者数组中有重复对象的情况,可以自定义深比较函数,再逐一匹配:

const array1 = [{id:1,name:'john'},{id:2,name:'wick'}];
const array2 = [{id:2,name:'wick'},{id:1,name:'john'}];

// 自定义对象深比较函数
const isEqualObj = (obj1, obj2) => {
  // 引用相同直接返回true
  if (obj1 === obj2) return true;
  
  // 类型不一致或为空直接返回false
  if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 === null || obj2 === null) {
    return obj1 === obj2;
  }
  
  // 获取所有属性(包括不可枚举属性)
  const keys1 = Object.getOwnPropertyNames(obj1);
  const keys2 = Object.getOwnPropertyNames(obj2);
  
  // 属性数量不一致返回false
  if (keys1.length !== keys2.length) return false;
  
  // 递归比较每个属性的值
  for (const key of keys1) {
    if (!keys2.includes(key) || !isEqualObj(obj1[key], obj2[key])) {
      return false;
    }
  }
  return true;
};

const isEqualArrays = (arr1, arr2) => {
  if (arr1.length !== arr2.length) return false;
  
  // 创建数组副本,避免修改原数组
  const arr2Copy = [...arr2];
  
  for (const obj of arr1) {
    // 在副本中查找匹配的对象
    const matchIdx = arr2Copy.findIndex(item => isEqualObj(obj, item));
    if (matchIdx === -1) return false;
    // 移除已匹配的对象,防止重复匹配
    arr2Copy.splice(matchIdx, 1);
  }
  
  // 所有对象都匹配成功则副本为空
  return arr2Copy.length === 0;
};

console.log(isEqualArrays(array1, array2)); // 输出: true

这个方案支持嵌套对象、重复元素,且能处理大部分数据类型,适用场景更广泛。

方案3:借助第三方库(如Lodash)

如果你项目中已经使用了Lodash,可以利用其内置的深比较和排序工具简化代码:

const _ = require('lodash');

const isEqualArrays = (arr1, arr2) => {
  if (arr1.length !== arr2.length) return false;
  // 按对象属性排序后再深比较
  return _.isEqual(
    _.sortBy(arr1, ['id', 'name']),
    _.sortBy(arr2, ['id', 'name'])
  );
};

console.log(isEqualArrays(array1, array2)); // 输出: true

内容的提问来源于stack exchange,提问作者Usama Abdul Razzaq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:01:11