如何合并多个数组并查找重复项?能否使用filter方法实现?
多数组查找重复项:使用filter及其他可行方案
你的代码问题分析
你代码里的concat操作是正常的,但后续调用join(" ")会把合并后的数组转换为字符串,而字符串并没有filter方法,这就是filter无法生效的核心原因。
修复方案:用filter实现多数组重复项查找
方法1:合并数组后筛选重复项(含去重结果)
先把所有数组合并,然后利用filter结合indexOf找出重复出现的元素,最后用Set去重得到唯一的重复任务列表:
let monday = ["task1", "task2", "task3", "task4", "taks5", "task6", "taks7"]; let tuesday = ["task2", "task3", "task4", "task5", "taks6"]; let wednesday = ["task7", "task8", "task9", "task10", "taks11", "task12"]; // 合并所有任务数组 const allTasks = monday.concat(tuesday, wednesday); // 筛选出所有重复出现的元素(会包含重复实例) const repeatedItems = allTasks.filter((task, index) => { // indexOf返回元素第一次出现的索引,不等则说明当前元素是重复项 return allTasks.indexOf(task) !== index; }); // 去重,得到唯一的重复任务列表 const uniqueDuplicates = [...new Set(repeatedItems)]; console.log(uniqueDuplicates); // 输出: ["task2", "task3", "task4"]
方法2:直接比对其他数组(适合少量数组)
如果数组数量不多,可以直接遍历其中一个数组,用filter结合includes检查元素是否存在于其他数组中:
const duplicates = monday.filter(task => { return tuesday.includes(task) || wednesday.includes(task); }); console.log(duplicates); // 输出: ["task2", "task3", "task4"]
其他高效方案(非filter)
如果处理大数据量数组,用Map统计出现次数的性能更优:
const taskCount = new Map(); allTasks.forEach(task => { taskCount.set(task, (taskCount.get(task) || 0) + 1); }); // 筛选出现次数大于1的任务 const duplicates = [...taskCount.entries()] .filter(([_, count]) => count > 1) .map(([task]) => task); console.log(duplicates); // 输出: ["task2", "task3", "task4"]
内容的提问来源于stack exchange,提问作者code grafo
相关产品推荐
相关产品推荐

