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

如何实现含重复元素的数组A与数组B的减法操作?

实现数组A从数组B中“单次移除式”减法

需求很明确:数组A里的每个元素,都要在数组B里找到对应的元素并删掉一次,最后剩下的就是目标结果。这里有两种靠谱的实现方式:

方法一:计数统计法(高效首选)

先统计A里每个元素需要移除的次数,再遍历B过滤出不需要移除的元素。这种方法跑起来快,数组越大优势越明显。

const A = ['Mo', 'Tu', 'We', 'Thu', 'Fr'];
const B = ['Mo', 'Mo', 'Mo', 'Tu', 'Thu', 'Fr', 'Sa'];

// 先记下来A里每个元素要删几次
const removeCounter = {};
for (const item of A) {
  removeCounter[item] = (removeCounter[item] || 0) + 1;
}

// 遍历B,该留的留,该删的跳过
const result = [];
for (const item of B) {
  if (removeCounter[item] > 0) {
    removeCounter[item]--;
  } else {
    result.push(item);
  }
}

console.log(result); // 输出: ['Mo', 'Mo', 'Sa']

方法二:遍历删除法(直观好懂)

先复制一份B的副本,然后挨个把A里的元素从副本里删掉第一个匹配项。这种写法简单直白,小数组用着顺手。

const A = ['Mo', 'Tu', 'We', 'Thu', 'Fr'];
const B = ['Mo', 'Mo', 'Mo', 'Tu', 'Thu', 'Fr', 'Sa'];

// 复制B,别直接改原数组
const tempB = [...B];

for (const item of A) {
  const targetIndex = tempB.indexOf(item);
  if (targetIndex !== -1) {
    tempB.splice(targetIndex, 1);
  }
}

console.log(tempB); // 输出: ['Mo', 'Mo', 'Sa']

两种方法对比

  • 计数法:时间复杂度O(n+m),效率拉满,适合处理大数组。
  • 遍历删除法:时间复杂度O(n*m),操作直观,小场景用着省心。

内容的提问来源于stack exchange,提问作者Tom el Safadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:20:34