2

I'm trying to filter out objects based on values in two arrays, but it keeps returning incorrect ones/too many.

Scenario:

I have an array of evidences and an array of assessments, which have to be filtered out by their dates. F.e. only evidences that are between assessment's startDate and endDate have to be returned in a new array. In my example below I keep returning all evidences, even though I ask to compare uploadDate between startDate and endDate:

let evidences = [
    { id: 'ev1', name: 'evidence 1', uploadDate: new Date('2023-04-28') },
    { id: 'ev2', name: 'evidence 2', uploadDate: new Date('2023-05-02') },
];

let assessments = [
    { id: 'ca1', name: 'assessment 1', startDate: new Date('2023-04-25'), endDate: new Date('2023-05-01') },
    { id: 'ca2', name: 'assessment 2', startDate: new Date('2023-05-02'), endDate: new Date('2023-05-08') },
];

let evidencesPerAssessment = [];

for (var i = 0; i < assessments.length; i++) {
    var startDate = assessments[i].startDate;
    var endDate = assessments[i].endDate;

    for (var j = 0; j < evidences.length; j++) {
        var uploadDate = evidences[j].uploadDate;

        if (uploadDate >= startDate && uploadDate <= endDate) {
            evidencesPerAssessment.push(evidences[j]);
        }
    }
}

console.log(evidencesPerAssessment);

What I want to achieve, is that for each assessment only evidences that are between its startDate and endDate would be pushed to the array. In this case with test data only 'evidence 1' should be shown for 'assessment 1' as that evidence's uploadDate (2023-04-28) is between startDate and endDate (2023-04-25 - 2023-05-01).

Does anyone have an idea on how to achieve this?

3
  • Check out this post stackoverflow.com/questions/48227286/…. It should answer your question. Commented May 2, 2023 at 9:15
  • In your final array you get evidence 1 for assessment 1, and then evidence 2 for assessment 2. What exact structure as a result would you want? Commented May 2, 2023 at 9:22
  • @Lux , I have an assessment form which should display all evidences that were attached to the assessment during its period. Let's say there are weekly assessments, so only evidences that were added in that week have to be shown in the form. My current issue is, that it still shows evidences that were created before that startDate and also those that were added after the endDate. Commented May 2, 2023 at 10:53

2 Answers 2

2

You need to make a few alterations to the flow of the code.

You need to distinguish between assessments, and this needs to be done inside the assessment loop, by creating a new array.

for (var i = 0; i < assessments.length; i++) {
    let evidencesPerAssessment = [];

let evidences = [
    { id: 'ev1', name: 'evidence 1', uploadDate: new Date('2023-04-28') },
    { id: 'ev2', name: 'evidence 2', uploadDate: new Date('2023-05-02') },
];

let assessments = [
    { id: 'ca1', name: 'assessment 1', startDate: new Date('2023-04-25'), endDate: new Date('2023-05-01') },
    { id: 'ca2', name: 'assessment 2', startDate: new Date('2023-05-02'), endDate: new Date('2023-05-08') },
];

for (var i = 0; i < assessments.length; i++) {
    let evidencesPerAssessment = [];
    console.log(assessments[i].name);
    var startDate = assessments[i].startDate;
    var endDate = assessments[i].endDate;

    for (var j = 0; j < evidences.length; j++) {
        var uploadDate = evidences[j].uploadDate;

        if (uploadDate >= startDate && uploadDate <= endDate) {
            evidencesPerAssessment.push(evidences[j]);
        }
    }
        console.log(evidencesPerAssessment);
 }

Sign up to request clarification or add additional context in comments.

Comments

1

The code you have written is working fine but you are pushing the values to a single array evidencesPerAssessment.Instead you push it to an array that is specific to a assessment.And can insert the array to the evidencesPerAssessment.

let evidences = [
    { id: 'ev1', name: 'evidence 1', uploadDate: new Date('2023-04-28') },
    { id: 'ev2', name: 'evidence 2', uploadDate: new Date('2023-05-02') },
];

let assessments = [
    { id: 'ca1', name: 'assessment 1', startDate: new Date('2023-04-25'), endDate: new Date('2023-05-01') },
    { id: 'ca2', name: 'assessment 2', startDate: new Date('2023-05-02'), endDate: new Date('2023-05-08') },
];

let evidencesPerAssessment = [];

for (var i = 0; i < assessments.length; i++) {
    var startDate = assessments[i].startDate;
    var endDate = assessments[i].endDate;
        let myarr=[]
    for (var j = 0; j < evidences.length; j++) {
        var uploadDate = evidences[j].uploadDate;

        if (uploadDate >= startDate && uploadDate <= endDate) {
            myarr.push(evidences[j]);
        }
    }
    evidencesPerAssessment.push(myarr);
}

console.log(evidencesPerAssessment);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.