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

如何使用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;
  });
}

实现思路

  1. 参数兼容:用剩余参数(...arrays)接收任意数量的数组输入,同时处理边界场景——当传入0或1个数组时,直接返回原数组(或空数组)。
  2. 去重元素收集:通过arrays.flat()展开所有嵌套数组,再借助Set去重,得到所有出现过的唯一元素集合。
  3. 出现次数统计:对每个唯一元素,用reduce遍历所有输入数组,统计该元素在多少个数组中存在。
  4. 目标元素筛选:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:50:17