对比不同长度对象数组:判断jobId缺失或current值不满足条件
数组对象对比逻辑修复
给定数组
test数组
var test = [{ jobId: 1, requiredNumber: 1, actualReq: 1, },{ jobId: 2, requiredNumber: 1, actualReq: 1, },{ jobId: 3, requiredNumber: 1, actualReq: 1, },{ jobId: 4, requiredNumber: 1, actualReq: 1, }]
testArr数组
var testArr = [{ jobId: 1, current: 1 }, { jobId: 2, current: 1 }, { jobId: 4, current: 1 }]
需求
遍历test数组,只要满足以下任一条件,返回true(标记存在问题):
- 当前
jobId在testArr中不存在(比如示例中的jobId=3) testArr中对应jobId的current值小于test中的actualReq值
原代码问题
你写的嵌套循环逻辑存在两个核心问题:
- 标记值被反复覆盖:每次内层循环都会修改
y的值,比如处理完jobId=3时y被设为true,但后续处理jobId=4时又会把y改回false,最终覆盖了正确结果。 - 无提前终止逻辑:只要找到一个符合条件的项,就可以直接返回结果,不需要继续遍历,原代码却会走完所有循环。
原代码:
var y = false; for (let i = 0; i < test.length; i++) { for (let j = 0; j < testArr.length; j++) { if (test[i].jobId === testArr[j].jobId) { if (test[i].actualReq <= testArr[j].current) { y = false } else { y =true } } else { y = true; } } } console.log(y);
正确实现
方法一:映射表+循环(高效)
先把testArr转成以jobId为键的映射表,避免嵌套循环,提升效率:
// 构建testArr的jobId映射表 const jobCurrentMap = new Map(); testArr.forEach(item => jobCurrentMap.set(item.jobId, item.current)); let hasProblem = false; for (const job of test) { const currentVal = jobCurrentMap.get(job.jobId); // 找不到对应jobId,或者current小于actualReq,标记为true并终止循环 if (currentVal === undefined || currentVal < job.actualReq) { hasProblem = true; break; } } console.log(hasProblem); // 输出true,符合预期
方法二:数组some方法(简洁)
利用数组some方法,只要有一项满足条件就返回true,代码更简洁:
const jobCurrentMap = new Map(testArr.map(item => [item.jobId, item.current])); const hasProblem = test.some(job => { const currentVal = jobCurrentMap.get(job.jobId); return currentVal === undefined || currentVal < job.actualReq; }); console.log(hasProblem); // 输出true
内容的提问来源于stack exchange,提问作者Mohamed Khalifa
相关产品推荐
相关产品推荐

