如何判断JavaScript字典数组中是否存在重复字典?
判断JavaScript字典数组中是否存在重复字典
我有一个字典数组,想要判断其中是否存在内容完全相同的字典。尝试过Lodash的_.uniq方法,但它只判断对象引用是否唯一,无法识别内容相等的不同对象;也试过Set,同样是基于引用判断唯一性。我知道Lodash的_.isEqual可以判断两个对象内容是否相等,请问该如何利用它或者其他方法实现需求?
示例数组(该情况下函数应返回true):
const arr = [ { "a": 1, "b": 2, }, { "a": 1, "b": 2, } ];
之前尝试的两种方法失效的核心原因:JavaScript中对象属于引用类型,_.uniq和Set默认都是通过引用地址判断元素是否唯一,而非对象的实际内容。哪怕两个对象的键值对完全一致,只要是不同的引用实例,就会被判定为不同元素。
方法一:Lodash _.uniqWith + _.isEqual
_.uniqWith支持传入自定义比较函数,直接搭配_.isEqual就能实现基于内容的去重判断:
function hasDuplicate(arr) { const uniqueArr = _.uniqWith(arr, _.isEqual); return uniqueArr.length !== arr.length; } console.log(hasDuplicate(arr)); // 输出 true
方法二:手动遍历 + _.isEqual
如果不想用_.uniqWith,可以手动嵌套遍历数组,用_.isEqual逐个比对元素:
function hasDuplicate(arr) { for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { if (_.isEqual(arr[i], arr[j])) { return true; } } } return false; } console.log(hasDuplicate(arr)); // 输出 true
方法三:原生JS实现(无需Lodash)
如果不想依赖第三方库,可以自己实现内容比对逻辑:
方案A:转有序JSON字符串
将对象转换为键有序的JSON字符串,再用Set判断唯一性(避免因键顺序不同导致误判):
// 将对象转为键有序的JSON字符串 function objToSortedStr(obj) { return JSON.stringify( Object.keys(obj).sort().reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {}) ); } function hasDuplicate(arr) { const strSet = new Set(arr.map(objToSortedStr)); return strSet.size !== arr.length; } console.log(hasDuplicate(arr)); // 输出 true
方案B:手动实现对象内容比对函数
递归比对对象的键和值,支持嵌套对象的判断:
// 判断两个对象内容是否相等 function isObjEqual(obj1, obj2) { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; for (const key of keys1) { const val1 = obj1[key]; const val2 = obj2[key]; // 值是对象则递归比对,否则直接比较值 if (typeof val1 === 'object' && typeof val2 === 'object') { if (!isObjEqual(val1, val2)) return false; } else if (val1 !== val2) { return false; } } return true; } function hasDuplicate(arr) { for (let i = 0; i < arr.length; i++) { for (let j = i + 1; j < arr.length; j++) { if (isObjEqual(arr[i], arr[j])) { return true; } } } return false; } console.log(hasDuplicate(arr)); // 输出 true
内容的提问来源于stack exchange,提问作者Floxio
相关产品推荐
相关产品推荐

