Jest中如何判断两个数组元素相同且出现次数一致(顺序无关)
Jest 验证数组元素出现次数相等的实现方案
Jest 本身没有提供原生 API 直接匹配「两个数组元素出现次数完全相等、不要求排列顺序」的需求,你可以用以下三种方案实现:
- 方案1:排序后对比(适合基础类型小数组)
先把两个数组按照相同规则排序,排序后数组结构完全一致,直接用toEqual匹配即可:
// 封装工具函数 const sorted = (arr) => [...arr].sort((a, b) => a - b) // 你的测试用例 expect(sorted([2,1,2])).toEqual(sorted([2,2,1])) // 测试通过 expect(sorted([3,2,1])).toEqual(sorted([1,2,3])) // 测试通过 expect(sorted([2,2,2,1])).toEqual(sorted([2,2,1])) // 测试报错
- 方案2:统计元素频次后对比(适合大数组/复杂类型元素)
先统计两个数组中每个元素的出现次数,再对比频次统计结果:
// 封装频次统计工具 const countMap = (arr) => { const map = new Map() arr.forEach(item => map.set(item, (map.get(item) || 0) + 1)) return map } // 你的测试用例 expect(countMap([2,1,2])).toEqual(countMap([2,2,1])) // 测试通过 expect(countMap([3,2,1])).toEqual(countMap([1,2,3])) // 测试通过 expect(countMap([2,2,2,1])).toEqual(countMap([2,2,1])) // 测试报错
- 方案3:使用扩展匹配器(可选)
如果项目允许引入 Jest 扩展库,jest-extended提供了现成的toIncludeSameMembers匹配器,可以直接满足需求:
expect([2,1,2]).toIncludeSameMembers([2,2,1]) // 测试通过 expect([3,2,1]).toIncludeSameMembers([1,2,3]) // 测试通过 expect([2,2,2,1]).toIncludeSameMembers([2,2,1]) // 测试报错
内容的提问来源于stack exchange,提问作者user15163984
相关产品推荐
相关产品推荐

