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

如何高效实现提取仅存在于单个数组中元素的函数?

优化方案:找出仅存在于单个数组的元素

需求说明

实现一个函数,返回仅存在于三个输入数组中某一个数组的元素,要求返回结果无重复,且适配不同长度的数组。

示例输入:

let arr1 = ['a', 'b', 'c', 'a', 'b']
let arr2 = ['a', 'd', 'b', 'c']
let arr3 = ['f', 'c', 'a']

预期输出:['d','f'] —— 其中'd'仅出现在arr2,'f'仅出现在arr3。

原暴力解法通过多层遍历结合includes检查实现,存在效率极低(includes为O(n)操作,多层嵌套后时间复杂度陡增)、可读性差的问题,以下是更优实现方案。

核心思路

统计每个元素被多少个不同的数组包含,最终筛选出仅被1个数组包含的元素。利用Set的O(1)查询特性和去重能力,大幅提升效率。

实现代码

function elementsInOnlyOneArr(a1, a2, a3) {
  // 将每个数组转为Set,实现内部去重+快速查询
  const set1 = new Set(a1);
  const set2 = new Set(a2);
  const set3 = new Set(a3);

  // 收集所有出现过的唯一元素
  const allElements = new Set([...set1, ...set2, ...set3]);

  const result = [];
  for (const el of allElements) {
    // 统计当前元素属于几个数组
    let count = 0;
    if (set1.has(el)) count++;
    if (set2.has(el)) count++;
    if (set3.has(el)) count++;
    // 仅属于一个数组则加入结果
    if (count === 1) {
      result.push(el);
    }
  }

  return result;
}

方案优势

  • 效率提升明显:Set的has操作是O(1),整体时间复杂度为O(n1 + n2 + n3),远优于原暴力解法的嵌套O(n*m)复杂度
  • 可读性更强:逻辑清晰,步骤明确,无需多层嵌套判断
  • 自动去重:通过Set处理后,结果天然无重复元素

扩展支持多数组

如果需要支持任意数量的输入数组,可以修改为以下通用版本:

function elementsInOnlyOneArr(...arrs) {
  // 将所有输入数组转为Set集合
  const sets = arrs.map(arr => new Set(arr));
  // 收集所有出现过的唯一元素
  const allElements = new Set();
  sets.forEach(set => set.forEach(el => allElements.add(el)));

  const result = [];
  for (const el of allElements) {
    let count = 0;
    // 统计元素在多少个Set中存在
    sets.forEach(set => set.has(el) && count++);
    // 仅属于一个数组则加入结果
    if (count === 1) result.push(el);
  }
  return result;
}

// 调用示例
elementsInOnlyOneArr(arr1, arr2, arr3); // 返回 ['d','f']

内容的提问来源于stack exchange,提问作者kilex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:20:28