JavaScript如何实现二维数组去重 保留唯一元素组合
JavaScript 二维二元组数组去重实现
核心判定规则:当子数组的两个元素(用户名、编程语言)完全一致时判定为重复项,仅保留首次出现的条目,同一用户对应不同编程语言的条目不受影响。
方法1:Set 序列化实现(代码最简洁)
利用Set自动去重基础类型的特性,将二元组转为特殊字符分隔的字符串做去重依据,最后再还原为二维数组,适合绝大多数常规场景。
const result = [["user1", "java"], ["user2", "python"],["user1", "java"], ["user1", "C++"], ["user1", "java"], ["user2", "Python"]] const uniqueResult = Array.from( // 选业务场景下不可能出现在用户名、语言名里的分隔符,比如|、@@@,避免字符串碰撞 new Set(result.map(item => item.join('|'))) ).map(str => str.split('|')) // 输出结果:[["user1", "java"], ["user2", "python"], ["user1", "C++"], ["user2", "Python"]]
注意:如果业务字段可能包含你选的分隔符,不要用这个方法,避免错误去重。
方法2:Map 标记实现(最稳妥,无碰撞风险)
遍历数组时用Map存储已经出现过的用户+语言组合,未标记过的条目才放入结果集,不存在序列化碰撞问题,还可以灵活扩展去重规则(比如大小写不敏感)。
const result = [["user1", "java"], ["user2", "python"],["user1", "java"], ["user1", "C++"], ["user1", "java"], ["user2", "Python"]] const existed = new Map() const uniqueResult = [] for (const [user, lang] of result) { // 组合唯一键,如需大小写不敏感去重,可改为 `${user.toLowerCase()}__${lang.toLowerCase()}` const uniqueKey = `${user}__${lang}` if (!existed.has(uniqueKey)) { existed.set(uniqueKey, true) uniqueResult.push([user, lang]) } }
方法3:filter + findIndex 实现(兼容老旧JS环境)
不需要依赖ES6的Map/Set特性,通过查找条目首次出现的索引判断是否为重复项,仅适合数据量小、需要兼容极低版本JS运行环境的场景,数据量过万时性能较差。
const result = [["user1", "java"], ["user2", "python"],["user1", "java"], ["user1", "C++"], ["user1", "java"], ["user2", "Python"]] const uniqueResult = result.filter((item, currentIndex) => { const firstAppearIndex = result.findIndex( target => target[0] === item[0] && target[1] === item[1] ) return firstAppearIndex === currentIndex })
内容的提问来源于stack exchange,提问作者user19464783
相关产品推荐
相关产品推荐

