比较不同长度的2个对象阵列



我有这个对象数组

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,
}]

和这个对象阵列

var testArr = [{ jobId: 1, current: 1 },
{ jobId: 2, current: 1 },
{ jobId: 4, current: 1 }]

我想比较这些数组,如果第二个数组(如jobId 3(缺少jobId,或者jobIdcurrent小于第一个数组的actualReq,则返回一个标志

我所做的是为每个数组制作嵌套循环并进行比较,但它对我不起作用

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);

它总是返回真实的

当你找到true时,你必须脱离循环

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,
}]
var testArr = [{
jobId: 1,
current: 1
},
{
jobId: 2,
current: 1
},
{
jobId: 4,
current: 1
}
]
var y = false;
main:
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
break main
}
} else {
y = true;
break
}
}
}
console.log(y);

我会用everysome代替

const 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,
}]
const testArr = [{
jobId: 1,
current: 1
},
{
jobId: 2,
current: 1
},
{
jobId: 4,
current: 1
}
]
const result = test.every(job => {
const other = testArr.find(j => job.jobId === j.jobId)
if (!other) return false
return job.actualReq <= other.current
})
console.log(result)

使用的问题语句的一个线性解决方案。我还没有更新你的逻辑

test.forEach(value=>  console.log(testArr.some(item => value.jobId === item.jobId && value.actualReq <= item.current)) )

如果想要具有真/假值的对象列表,可以使用filter方法

true:

test.filter(value=>  testArr.some(item => value.jobId === item.jobId && value.actualReq <= item.current) )

false:

test.filter(value=>  !testArr.some(item => value.jobId === item.jobId && value.actualReq <= item.current) )

您应该能够用一个循环来完成这一操作,在第一个数组上循环。然后可以使用Array。查找以查看作业ID是否存在于第二个数组中。如果没有,你可以返回(或者做任何你想做的事(,然后比较第二个目标,actualReqcurrent

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: 2,
}]

var testArr = [{ jobId: 1, current: 1 },
{ jobId: 2, current: 1 },
{ jobId: 4, current: 1 }]

test.forEach((t) => {
const matching = testArr.find((ta) => ta.jobId === t.jobId)
// The jobId is missing, log it and return it
if (!matching) {
console.log(t.jobId, 'is missing')
return t.jobId
} 

if (matching.current < t.actualReq) {
console.log(`Job ID: ${matching.jobId} -`, matching.current, 'is less than', t.actualReq)
} 
})

最新更新