如何比较两个键结构一致的对象数组是否相等(不考虑元素顺序)
忽略元素顺序的对象数组相等判断方案
原代码问题说明
- 未提前校验数组长度,长度不同的数组天然不可能相等
- 内层循环逻辑错误,每次循环都会覆盖布尔结果,最终结果仅等于最后一次比较的返回值,还存在循环变量误用的问题,将
detail2[j]写为detail2[i] - 未处理数组元素顺序不一致的场景,顺序调换后会判定为不相等
实现思路
- 前置校验:两个数组长度不一致直接返回
false,避免后续无意义计算 - 对象序列化:将每个对象按照固定规则转为唯一字符串,因为题干明确键结构固定,我们可以将对象按键排序后拼接为标识字符串,避免键顺序或对象插入顺序对结果产生影响
- 数组排序后比较:将两个数组的所有序列化结果排序,再逐位比较是否完全一致即可,不受原始数组元素顺序影响
代码实现
function isArraysEqualIgnoreOrder(arr1, arr2) { // 长度不等直接返回false if (arr1.length !== arr2.length) return false // 对象转唯一标识字符串方法 const serializeObj = (obj) => { // 按键排序后拼接字符串,兼容性更强 return Object.keys(obj) .sort() .map(key => `${key}:${obj[key]}`) .join(',') // 若确认对象键顺序始终一致,也可以直接用JSON.stringify(obj),效率更高 } // 两个数组转序列化数组后排序 const sortedSerializedArr1 = arr1.map(serializeObj).sort() const sortedSerializedArr2 = arr2.map(serializeObj).sort() // 逐位比较 for(let i = 0; i < sortedSerializedArr1.length; i++) { if (sortedSerializedArr1[i] !== sortedSerializedArr2[i]) return false } return true }
测试用例
测试场景1:元素顺序调换,内容完全一致
let detail1 = [ {'book':'LOTR','price':'14'}, {'book':'Harry pottar','price':'12'}, ] let detail2 = [ {'book':'Harry pottar','price':'12'}, {'book':'LOTR','price':'14'} ] console.log(isArraysEqualIgnoreOrder(detail1, detail2)) // 输出true
测试场景2:数组长度不同
let detail3 = [ {'book':'LOTR','price':'14'}, {'book':'Harry pottar','price':'12'}, ] let detail4 = [ {'book':'Harry pottar','price':'15'}, {'book':'LOTR','Price':'14'}, {'book':'HPP','Price':'21'} ] console.log(isArraysEqualIgnoreOrder(detail3, detail4)) // 输出false
测试场景3:长度相同但元素值不同
let detail5 = [ {'book':'LOTR','price':'14'}, {'book':'Harry pottar','price':'12'}, ] let detail6 = [ {'book':'Harry pottar','price':'15'}, {'book':'LOTR','price':'14'} ] console.log(isArraysEqualIgnoreOrder(detail5, detail6)) // 输出false
内容的提问来源于stack exchange,提问作者Sushant Rad
相关产品推荐
相关产品推荐

