数组对比提取不匹配项:如何完整获取成对的模块代码与学分?
数组对比提取不匹配项:如何完整获取成对的模块代码与学分?
嗨,我完全懂你的困扰!你现在的问题核心在于——你的数组元素是成对绑定的(每两个元素一组:学分+模块代码),但你当前的代码把每个元素单独拿出来对比,这就导致当其他模块有相同学分(比如案例里的3)时,对应的学分就被误过滤掉了,只留下了模块代码。
咱们得换个思路:既然数据是成对的,那就要把每组数据当成一个整体来对比,而不是拆分单个元素。
解决方案思路
先把两个原始数组转换成键值对结构(比如用Map),用模块代码作为键,对应的学分作为值,这样就能把每组数据牢牢绑定在一起。之后对比这两个Map,找出只在其中一个Map里存在的模块,再把对应的学分和模块代码组合成你想要的数组格式。
具体代码实现
先写一个辅助函数,把你的数组转换成Map:
function arrayToModuleMap(arr) { const moduleMap = new Map(); // 每次步进2,处理成对的学分和模块代码 for (let i = 0; i < arr.length; i += 2) { const credit = arr[i]; const moduleCode = arr[i + 1]; moduleMap.set(moduleCode, credit); } return moduleMap; }
然后用这个函数处理你的两个数组,再找出不匹配的成对数据:
// 你的原始数组 const moduleAndCreditByUser = ['6', 'sjfru1', '3', 'nfu3ai', '3', 'sgvnfs']; const moduleToUpdate = ['3', 'sgvnfs', '6', 'sjfru1']; // 转换成Map结构 const userModuleMap = arrayToModuleMap(moduleAndCreditByUser); const updateModuleMap = arrayToModuleMap(moduleToUpdate); const unmatchedPairs = []; // 找出用户数组中有,但更新数组中没有的模块(也就是你要的目标数据) userModuleMap.forEach((credit, moduleCode) => { if (!updateModuleMap.has(moduleCode)) { unmatchedPairs.push(credit, moduleCode); } }); // 如果你还需要找出更新数组中有,但用户数组中没有的模块,可以取消下面注释 // updateModuleMap.forEach((credit, moduleCode) => { // if (!userModuleMap.has(moduleCode)) { // unmatchedPairs.push(credit, moduleCode); // } // }); console.log(unmatchedPairs); // 输出:['3', 'nfu3ai']
为什么这个方法可行?
通过Map把每个模块和它的学分绑定成一个整体后,我们对比的就是整个模块+学分的组合,而不是单个的数字或字符串。这样就不会出现因为其他模块有相同学分,导致目标学分被误过滤的情况了。
备注:内容来源于stack exchange,提问作者poljs
相关产品推荐
相关产品推荐

