如何在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 }
代码说明
- 先遍历第二个数组
arrB,用Map统计每个元素的出现次数 - 遍历第一个数组
arrA,每遇到一个元素:- 如果该元素在Map中还有剩余次数,就将次数减1
- 如果没有剩余次数(或者从未在arrB中出现),就将该元素加入结果数组
- 最终返回的结果就是
arrA中扣除arrB对应出现次数后剩下的元素
内容的提问来源于stack exchange,提问作者maxhodges
相关产品推荐
相关产品推荐

