JavaScript如何比较数组中近似相似字符串并按规则去重
JavaScript按任务维度数组去重实现方案
核心判断逻辑:你的去重规则是同任务仅保留第一条出现的记录,不需要做模糊的字符串相似度匹配,两种数据格式都可以通过「记录已出现的任务名,过滤重复任务条目」的方式实现,时间复杂度O(n),性能最优。
针对字符串格式数组(示例1)
字符串的格式固定为任务名 - 成员名,分隔符-是明确的拆分标识:
let arrayA = ["task A - memberA", "task A - memberB", "task B - memberA"] // 用Set存储已经出现过的任务名,查询效率O(1) const existedTasks = new Set() arrayA = arrayA.filter(item => { // 拆分字符串拿到任务名,如果分隔符两边空格不固定,可以用正则 /\s*-\s*/ 匹配拆分 const taskName = item.split(' - ')[0] if (existedTasks.has(taskName)) return false existedTasks.add(taskName) return true }) // 运行结果:["task A - memberA", "task B - memberA"],和预期一致
针对对象格式数组(示例2)
对象结构直接内置了task字段,不需要做字符串拆分,逻辑更简单:
let arrayA = [ {task: "Task A", member: "MemberA"}, {task: "Task A", member: "MemberB"}, {task: "Task B", member: "MemberB"} ] const existedTasks = new Set() arrayA = arrayA.filter(item => { const taskName = item.task if (existedTasks.has(taskName)) return false existedTasks.add(taskName) return true }) /* 运行结果: [ {task: "Task A", member: "MemberA"}, {task: "Task B", member: "MemberB"} ] 和预期一致 */
扩展说明
如果后续遇到无明确分隔符、存在拼写差异的近似字符串匹配场景(比如"taskA"和"task A"需要判定为同任务),可以引入莱文斯坦距离(编辑距离)算法计算字符串相似度,设置合理阈值判定是否为同一任务。但你当前给出的场景规则明确,上述方案是最简、性能最好的实现。
内容的提问来源于stack exchange,提问作者NDC8
相关产品推荐
相关产品推荐

