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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:05:30