Skip to content

Instantly share code, notes, and snippets.

@killertilapia
Last active June 19, 2020 00:03
Show Gist options
  • Save killertilapia/8a703cdd60c47731d9370d8550851146 to your computer and use it in GitHub Desktop.
Save killertilapia/8a703cdd60c47731d9370d8550851146 to your computer and use it in GitHub Desktop.
recursive filter for lists; Is this any good?
interface FilterListEntry {
listId: String,
name?: String
}
export class test_filter_class{
// unfilterCompanies = [comp_ids]
// eg. unfilterCompanies = [123,456,789]
private apply_filter = async (filterInfo: Array<FilterListEntry>, unfilterCompanies: any) => {
if(filterInfo.length == 1){
let filterInfoEntry = filterInfo.pop();
let filterList = await MailingListCompany.find({ "mailingList": filterInfoEntry.listId })
.lean();
let filterData = await MailingList.findById(filterList[0].mailingList);
let theFilter = filterList.map((e) => { return e.company });
let yesInFilter = unfilterCompanies.filter((el) => theFilter.includes(el._id));
let notInFilter = unfilterCompanies.filter((el) => !theFilter.includes(el._id));
yesInFilter.forEach((e) => {
e[`${filterData.name} filter`] = true
});
return [...yesInFilter, ...notInFilter]
} else {
let filterInfoEntry = filterInfo.pop();
let filterList = await MailingListCompany.find({ "mailingList": filterInfoEntry.listId })
.lean();
let filterData = await MailingList.findById(filterList[0].mailingList);
let theFilter = filterList.map((e) => { return e.company });
let yesInFilter = unfilterCompanies.filter((el) => theFilter.includes(el._id));
let notInFilter = unfilterCompanies.filter((el) => !theFilter.includes(el._id));
yesInFilter.forEach((e) => {
e[`${filterData.name} filter`] = true
});
return this.apply_filter(filterInfo, [...yesInFilter, ...notInFilter])
}
}
}
@elagasca-innovuze
Copy link

If the code inside the if..else are similar except for the return, perhaps rewrite it to this?

export class test_filter_class{
    
    private apply_filter = async (filterInfo: Array<FilterListEntry>, unfilterCompanies: any) => {
        if (filterInfo.length == 1) { return [...yesInFilter, ...notInFilter] }
     
        let filterInfoEntry = filterInfo.pop();
        let filterList = await MailingListCompany.find({ "mailingList": filterInfoEntry.listId })            
            .lean();

        let filterData = await MailingList.findById(filterList[0].mailingList);

        let theFilter = filterList.map((e) => { return e.company });
        let yesInFilter = unfilterCompanies.filter((el) => theFilter.includes(el._id));
            let notInFilter = unfilterCompanies.filter((el) => !theFilter.includes(el._id));

            yesInFilter.forEach((e) => {
                e[`${filterData.name} filter`] = true
            });

            return this.apply_filter(filterInfo, [...yesInFilter, ...notInFilter]) 
        
    }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment