简体   繁体   中英

Filter an array based on data from two different arrays using lodash

I need to filter an array based on the data of the two different arrays. Below is the example and expected result.

let groupedProtocolFilterValues = [
    ["Risk score < 4"]
];
let groupedPatientFilterValues = [
    ["CARDIOLOGY B2 INTERN2 ADMIT PRIMARY TEAM", "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM"]
];

let events = [{
    "_id": "5d087b842c3f77e7a0c674e5",
    "alert": {
        "title": "Risk score < 3",
        "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}, {
    "_id": "5d087b842c3f77e7a0c674e6",
    "alert": {
        "title": "Risk score < 4",
        "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}, {
    "_id": "5d087b842c3f77e7a0c674e7",
    "alert": {
        "title": "Risk score < 4",
        "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}, {
    "_id": "5d087b842c3f77e7a0c674e8",
    "alert": {
        "title": "Risk score < 4",
        "patientLocation": "CARDIOLOGY B1 INTERN1 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}];

Here i would like to filter 'event' array based on the data of 'groupedProtocolFilterValues' and 'groupedPatientFilterValues'. So looking at the current data expected result should be

events = [{
    "_id": "5d087b842c3f77e7a0c674e6",
    "alert": {
        "title": "Risk score < 4",
        "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}, {
    "_id": "5d087b842c3f77e7a0c674e7",
    "alert": {
        "title": "Risk score < 4",
        "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\r\r\nCARDIOMYOPATHY CONSULT"
    },
    "createdAt": "2019-06-18T05:49:56.402Z"
}];

I want to check if any of the "events" array element contains "Risk score < 4" and "CARDIOLOGY B2 INTERN2 ADMIT PRIMARY TEAM" or "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM".

In short i need to apply below filtration condition:

ANDING BETWEEN 'groupedPatientFilterValues/groupedProtocolFilterValues'

ORING WITHIN 'groupedPatientFilterValues' AND 'groupedProtocolFilterValue'

It's not needed to use lodash for this task, .filter will do the work:

 let groupedProtocolFilterValues = [ ["Risk score < 4"] ]; let groupedPatientFilterValues = [ ["CARDIOLOGY B2 INTERN2 ADMIT PRIMARY TEAM", "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM"] ]; let flattenedProtocols = groupedProtocolFilterValues.reduce((res, cur) => res = res.concat(cur), []); let flattenedLocations = groupedPatientFilterValues.reduce((res, cur) => res = res.concat(cur), []); let events = [{ "_id": "5d087b842c3f77e7a0c674e5", "alert": { "title": "Risk score < 3", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e6", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e7", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e8", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY B1 INTERN1 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }]; const result = events.filter(x => { return (!flattenedProtocols.length || flattenedProtocols.indexOf(x.alert.title) >= 0) && (!flattenedLocations.length || flattenedLocations.some(c => x.alert.patientLocation.includes(c))); }); console.log(result); 

Instead of lodash, use filter .

 let groupedProtocolFilterValues = [ ["Risk score < 4"] ]; let groupedPatientFilterValues = [ ["CARDIOLOGY B2 INTERN2 ADMIT PRIMARY TEAM", "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM"] ]; let events = [{ "_id": "5d087b842c3f77e7a0c674e5", "alert": { "title": "Risk score < 3", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e6", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e7", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY CHF INTERN2 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }, { "_id": "5d087b842c3f77e7a0c674e8", "alert": { "title": "Risk score < 4", "patientLocation": "CARDIOLOGY B1 INTERN1 ADMIT PRIMARY TEAM\\r\\r\\nCARDIOMYOPATHY CONSULT" }, "createdAt": "2019-06-18T05:49:56.402Z" }]; const output = events.filter(({ alert: { title, patientLocation } }) => { return groupedProtocolFilterValues[0].includes(title) && groupedPatientFilterValues[0].some((val) => { const patientLocationName = patientLocation.split('\\n')[0]; return val.trim().includes(patientLocationName.trim()); }); }); console.log(output); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM