如何判断元素属性相同但顺序不同的两个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
相关产品推荐
相关产品推荐

