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

JavaScript中使用Set合并数组去重:空数组导致结果异常问题

问题原因与解决办法

核心错误:Set构造函数的参数误用

你写的const tmp = [...new Set([...tmp1],[...tmp2])]本质是错误写法——Set构造函数仅接受一个可迭代对象作为参数,传入的第二个参数会被直接忽略。

为什么两种场景表现不同?

  1. 当tmp1为空数组时:
    [...tmp1]是空数组,作为第一个参数传给Set后,Set内部无任何元素,第二个参数[...tmp2]被直接忽略,所以扩展后得到空数组,这就是你遇到的问题。
  2. 当tmp1和tmp2都包含对象时:
    你觉得“正常去重”是巧合——Set只处理了第一个参数[...tmp1]里的对象,第二个参数[...tmp2]同样被忽略。如果tmp2里的对象和tmp1是同一引用,Set自然不会重复添加;但如果是内容相同但引用不同的对象,Set根本不会去重(因为Set判断重复的依据是严格相等===,对象的===比较的是引用地址)。

你调整后的写法为什么偶然有效?

const tmp = [...new Set(...tmp1,[...tmp2])]在tmp1为空时,...tmp1展开后无元素,相当于new Set([...tmp2]),所以能得到正确结果。但这个写法非常脆弱:如果tmp1里有元素,比如tmp1 = [1,2],...tmp1会把元素逐个传入Set构造函数,变成new Set(1, 2, [...tmp2]),此时第一个参数1不是可迭代对象,直接会抛出错误。

正确的解决方法

基础版本:合并数组后去重

先将两个数组合并成一个,再传入Set构造函数,这是通用且安全的写法:

const tmp1 = [];
const tmp2 = [{
    guid:"e695d848-7188-4741-9c95-44bec634940f",
    name: "Spreading.pdf",
    code: "G1"
}];
// 正确写法:先合并两个数组,再用Set去重
const tmp = [...new Set([...tmp1, ...tmp2])];

这个写法不管tmp1或tmp2是否为空,都能正确合并并去重(注意:仅对原始类型和同一引用的对象有效)。

进阶版本:按对象内容去重

如果需要对内容相同但引用不同的对象去重(比如根据guid字段),Set的方法就不适用了,此时可以用Array.filter结合Map实现:

const tmp1 = [{
    guid:"e695d848-7188-4741-9c95-44bec634940f",
    name: "Spreading.pdf",
    code: "G1"
}];
const tmp2 = [{
    guid:"e695d848-7188-4741-9c95-44bec634940f",
    name: "Spreading.pdf",
    code: "G1"
}];

// 根据guid字段去重(适合小数据量)
const tmp = [...tmp1, ...tmp2].filter((item, index, arr) => {
    return arr.findIndex(i => i.guid === item.guid) === index;
});

// 用Map实现(性能更优,适合大数据量)
const map = new Map();
[...tmp1, ...tmp2].forEach(item => {
    if (!map.has(item.guid)) {
        map.set(item.guid, item);
    }
});
const result = Array.from(map.values());

内容的提问来源于stack exchange,提问作者JarochoEngineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:45:13