I have this array of objects I have tried to remove a duplicate from the array, but I can't remove it based on a condition this is the array
result = [
{ jobId: 2, requiredNumber: 2, acceptableRate: 80 },
{ jobId: 3, requiredNumber: 3, acceptableRate: 80 },
{ jobId: 4, requiredNumber: 1, acceptableRate: 80 },
{ jobId: 2, requiredNumber: 1, acceptableRate: 95 }
]
what I have done is using the .filter() and the .findIndex() but I can't get my excepted output
this is what I have done
var mm = result.filter(
(value, index, self) =>
index === self.findIndex((t) => t.jobId === value.jobId)
);
console.log(mm);
my output was
[
{ jobId: 2, requiredNumber: 2, acceptableRate: 80 },
{ jobId: 3, requiredNumber: 3, acceptableRate: 80 },
{ jobId: 4, requiredNumber: 1, acceptableRate: 80 }
]
expected output is based on my condition which can be based on higher acceptableRate or higher requiredNumber
[
{ jobId: 2, requiredNumber: 1, acceptableRate: 95 },
{ jobId: 3, requiredNumber: 3, acceptableRate: 80 },
{ jobId: 4, requiredNumber: 1, acceptableRate: 80 },
]
CodePudding user response:
First sort the array by acceptableRate or if they are the same values by requiredNumber then find duplicates. This way.
result = [
{ jobId: 2, requiredNumber: 2, acceptableRate: 80 },
{ jobId: 3, requiredNumber: 3, acceptableRate: 80 },
{ jobId: 4, requiredNumber: 1, acceptableRate: 80 },
{ jobId: 2, requiredNumber: 1, acceptableRate: 95 },
];
result.sort(function (a, b) {
return b.acceptableRate - a.acceptableRate || b.requiredNumber - a.requiredNumber;
});
var mm = result.filter(
(value, index, self) =>
index === self.findIndex((t) => t.jobId === value.jobId),
);
console.log(mm);
CodePudding user response:
The following code will filter the values for you if the jobId comes first according to acceptableRate, and if there are two identical values then it will filter according to requiredNumber
var mm = result.sort((a, b) => b.jobId < a.jobId ? true : b.jobId > a.jobId ? false : b.acceptableRate > a.acceptableRate ? true : b.acceptableRate < a.acceptableRate ? false : b.requiredNumber - a.requiredNumber);
CodePudding user response:
If I understood your question right, here might be the code. We filter out all the items if there's an item with same jobId and higher acceptableRate.
const result = [
{ jobId: 2, requiredNumber: 2, acceptableRate: 80 },
{ jobId: 3, requiredNumber: 3, acceptableRate: 80 },
{ jobId: 4, requiredNumber: 1, acceptableRate: 80 },
{ jobId: 2, requiredNumber: 1, acceptableRate: 95 }
];
const finalResult = result.filter(x =>
!result.find(r =>
r.jobId === x.jobId &&
r.acceptableRate > x.acceptableRate));
console.log(finalResult);
