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

如何在JavaScript中获取两个数组元素的绝对差异(含重复值处理)

基于元素出现次数的数组差异计算需求

我在StackOverflow找了很多相关示例,但没找到符合需求的重复值处理方案。我需要的是基于元素出现次数计算数组差异,而不是只判断值是否存在。

需求示例

示例1

给定数组:

const a = ['a', 'a', 'b']
const b = ['a', 'b']

期望结果:

// 取a中减去b对应出现次数后的剩余元素
returnAllElementsFromAThatAreNotInB(a, b) // 输出: ['a']
// 取b中减去a对应出现次数后的剩余元素
returnAllElementsFromAThatAreNotInB(b, a) // 输出: []

示例2

给定数组:

const a2 = [1, 2, 2, 3, 4, 4]
const b2 = [1, 2, 2, 3, 3, 4]

期望结果:

returnAllElementsFromAThatAreNotInB(a2, b2) // 输出: [4]
returnAllElementsFromAThatAreNotInB(b2, a2) // 输出: [3]

之前看到的普通数组差异/对称差异方案无效,因为它们只检查值是否存在,不考虑出现次数,会返回空数组,不符合需求。

实现方案

可以通过统计数组中元素的出现次数,再根据次数差生成结果数组:

function returnAllElementsFromAThatAreNotInB(arrA, arrB) {
  // 统计arrB中各元素的出现次数
  const countMap = new Map()
  for (const item of arrB) {
    countMap.set(item, (countMap.get(item) || 0) + 1)
  }

  const result = []
  for (const item of arrA) {
    const currentCount = countMap.get(item)
    if (currentCount && currentCount > 0) {
      countMap.set(item, currentCount - 1)
    } else {
      result.push(item)
    }
  }
  return result
}

代码说明

  1. 先遍历第二个数组arrB,用Map统计每个元素的出现次数
  2. 遍历第一个数组arrA,每遇到一个元素:
    • 如果该元素在Map中还有剩余次数,就将次数减1
    • 如果没有剩余次数(或者从未在arrB中出现),就将该元素加入结果数组
  3. 最终返回的结果就是arrA中扣除arrB对应出现次数后剩下的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:06:17