如何筛选出双值均存在于另一JSON数组Code中的JSON元素?
问题分析与解决思路
原代码的问题
- 数值类型误用
includes方法:wechselwirkungen[i][1]是数值(比如1234),而includes是数组/字符串的专属方法,直接调用会抛出错误; - 逻辑判断错误:你试图让同一个
medArray[j].Code同时匹配wechselwirkungen[i][1]和wechselwirkungen[i][2],这显然不可能(单个Code只能对应一个值),正确逻辑应该是两个值分别存在于medArray的Code集合中; - 未收集返回结果:原代码仅做了日志输出,没有将符合条件的元素收集并返回。
修正方案
核心思路
- 先把medArray中的所有Code提取到一个
Set集合中,利用Set的O(1)查找效率提升性能; - 遍历
wechselwirkungen数组,对每个元素检查它的两个值是否都在Code集合中,收集符合条件的元素并返回。
完整代码
function findPairs(medArray, wechselwirkungen) { // 提取所有Code到Set中,实现快速查找 const codeSet = new Set(medArray.map(item => item.Code)); // 筛选出两个值都在Code集合中的元素 return wechselwirkungen.filter(item => { const val1 = item["1"]; const val2 = item["2"]; return codeSet.has(val1) && codeSet.has(val2); }); } // 测试用例 const wechselwirkungen = [{"1": 1234, "2": 5678}, {"1": 2222, "2": 1111}, {"1": 2222, "2": 5678}]; const medArray = [{"Code": 1234}, {"Code": 5678}, {"Code": 2222}]; console.log(findPairs(medArray, wechselwirkungen)); // 输出:[{"1": 1234, "2": 5678}, {"1": 2222, "2": 5678}]
补充说明
- Set的优势:相比嵌套循环遍历medArray检查存在性,Set的
has方法时间复杂度为O(1),整体时间复杂度从O(n*m)降低到O(n+m),数据量越大效率提升越明显; - 函数通用性优化:把
wechselwirkungen作为参数传入,避免依赖全局变量,让函数可以复用在不同的数组组合场景; - 代码可读性:使用数组
filter方法替代嵌套循环,逻辑更直观,代码更简洁。
内容的提问来源于stack exchange,提问作者mm1975
相关产品推荐
相关产品推荐

