求助:实现判断数组元素出现次数匹配的JavaScript函数
解决方案
首先需要统计两个数组中每个元素的出现次数,再根据你的示例规则完成校验。从给出的例子来看,判断逻辑应该是:
- Array2中的所有元素必须在Array1中存在;
- Array2中每个元素的出现次数不能超过Array1中对应元素的次数;
- Array2中至少有一个元素的出现次数与Array1中该元素的次数完全相同。
实现代码
function checkArrays(first, second) { // 统计第一个数组的元素出现频率 const countFirst = {}; for (const num of first) { countFirst[num] = (countFirst[num] || 0) + 1; } // 统计第二个数组的元素出现频率 const countSecond = {}; for (const num of second) { countSecond[num] = (countSecond[num] || 0) + 1; } let hasMatchCount = false; // 遍历校验第二个数组的频率数据 for (const [num, count] of Object.entries(countSecond)) { // 元素不存在于第一个数组,直接返回false if (!countFirst.hasOwnProperty(num)) { return false; } // 出现次数超过第一个数组的对应元素,返回false if (count > countFirst[num]) { return false; } // 标记是否有元素的出现次数完全匹配 if (count === countFirst[num]) { hasMatchCount = true; } } // 必须满足前面的所有校验,且至少有一个元素次数完全匹配 return hasMatchCount; }
测试你的示例
- 测试用例1:
const Array1 = [1,1,1,2,2,2,3,3]; const Array2 = [1,1,2,1]; console.log(checkArrays(Array1, Array2)); // 输出: true
解释:Array2中1的出现次数为3,与Array1中的1次数完全匹配,且2的次数1不超过Array1的3次,符合规则。
- 测试用例2:
const Array2 = [1,1,2]; console.log(checkArrays(Array1, Array2)); // 输出: false
解释:Array2中1的次数为2(小于Array1的3次),2的次数为1(小于Array1的3次),没有元素的次数与Array1完全匹配,不符合规则。
- 测试用例3:
const Array2 = [1,1,2,3,1]; console.log(checkArrays(Array1, Array2)); // 输出: true
解释:Array2中1的次数为3,与Array1中的1次数完全匹配,2和3的次数都不超过Array1中的对应次数,符合规则。
调整规则的情况
如果你的实际需求是仅校验Array2中所有元素的出现次数不超过Array1中的,不需要至少一个元素次数匹配,可以简化代码:
function checkArrays(first, second) { const countFirst = {}; for (const num of first) { countFirst[num] = (countFirst[num] || 0) + 1; } const countSecond = {}; for (const num of second) { countSecond[num] = (countSecond[num] || 0) + 1; } for (const [num, count] of Object.entries(countSecond)) { if (!countFirst.hasOwnProperty(num) || count > countFirst[num]) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者Prathamesh Koyande
相关产品推荐
相关产品推荐

