如何使用filter和reduce重构diff函数以实现多数组对称差集?
重构多数组差集函数diff,支持任意数量参数
重构后的diff函数
function diff(...arrays) { // 处理参数数量小于等于1的边界情况 if (arrays.length <= 1) { return arrays[0] || []; } // 提取所有数组中的不重复元素 const uniqueElements = [...new Set(arrays.flat())]; // 筛选仅在单个数组中出现的元素 return uniqueElements.filter(item => { // 统计元素在多少个数组中出现 const occurrenceCount = arrays.reduce((count, currentArr) => { return count + (currentArr.includes(item) ? 1 : 0); }, 0); return occurrenceCount === 1; }); }
实现思路
- 参数兼容:用剩余参数(
...arrays)接收任意数量的数组输入,同时处理边界场景——当传入0或1个数组时,直接返回原数组(或空数组)。 - 去重元素收集:通过
arrays.flat()展开所有嵌套数组,再借助Set去重,得到所有出现过的唯一元素集合。 - 出现次数统计:对每个唯一元素,用
reduce遍历所有输入数组,统计该元素在多少个数组中存在。 - 目标元素筛选:用
filter保留那些仅在单个数组中出现的元素,这就是符合测试要求的差集结果。
测试验证
将重构后的函数代入你的Jest测试用例,所有场景均可通过:
- 多数组场景:
diff([1, 2], [1, 2, 3], [1, 2, 3, 4])返回[4],仅保留只在单个数组出现的元素。 - 全重复场景:
diff([1, 2], [1, 2], [1, 2])返回空数组,因为所有元素在所有数组中都存在。 - 单数组场景:
diff([1, 2])直接返回原数组,符合预期。 - 两数组独元素场景:
diff(['diorite', 'andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub'])返回['pink wool'],正确识别仅在第一个数组出现的元素。
内容的提问来源于stack exchange,提问作者Ala Eddine Menai
相关产品推荐
相关产品推荐

