如何按动态键值对比较无序对象数组?需输出不匹配对象
解决方案:无序比较单键值对对象数组
核心思路是把数组转换成键值映射对象(因每个元素都是单键值对,不存在重复键冲突),以此忽略原数组的顺序,直接对比映射内容即可。
步骤拆解
- 编写转换函数:将单键值对对象数组转为普通键值对象
- 对比两个映射对象的键集合与对应值
- 收集所有不匹配的键值对并还原为原格式
代码实现
// 将单键值对数组转为键值映射对象 function arrayToMap(arr) { return arr.reduce((map, obj) => { const [key, value] = Object.entries(obj)[0]; map[key] = value; return map; }, {}); } // 比较两个数组,返回匹配结果和不匹配项 function compareUnorderedArrays(arr1, arr2) { const map1 = arrayToMap(arr1); const map2 = arrayToMap(arr2); // 获取所有出现过的键,避免遗漏单边存在的项 const allKeys = new Set([...Object.keys(map1), ...Object.keys(map2)]); const mismatches = []; for (const key of allKeys) { if (map1[key] !== map2[key]) { // 把不匹配的键值对还原为原数组的单键对象格式 mismatches.push({ [key]: map1[key] ?? map2[key] }); } } return mismatches.length === 0 ? true : { isMatch: false, mismatches }; } // 测试示例 const array1 = [{name: 'Alice'}, {mobile: '1234'}]; const array2 = [{mobile: '1234'}, {name: 'Alice'}]; const array3 = [{name: 'Alice'}, {mobile: '24pp'}]; console.log(compareUnorderedArrays(array1, array2)); // true console.log(compareUnorderedArrays(array1, array3)); // { isMatch: false, mismatches: [{ mobile: '24pp' }] }
说明
arrayToMap用reduce遍历数组,提取每个单键对象的键值存入映射,自动抹平原数组的顺序差异- 对比时先收集所有键,确保不会漏掉「一方有、另一方无」的不匹配项
- 不匹配项会还原为原数组的单键对象格式,完全贴合需求
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

