我有这个对象数组
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,或者jobId
的current
小于第一个数组的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);
我会用every
或some
代替
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是否存在于第二个数组中。如果没有,你可以返回(或者做任何你想做的事(,然后比较第二个目标,actualReq
和current
。
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)
}
})