Search code examples
javascriptperformancelodash

javascript multiple filter or condtional code optimization


I have an array of object like this :

const items = [
   {
       id: 1,
       status: "active",
       paid: true,
       name: "item-1"
   },
   {
       id: 2,
       status: "active",
       paid: false,
       name: "item-2"
   },
   {
       id: 3,
       status: "not active",
       paid: false,
       name: "item-3"
   },
]

and i have a function to filter it like this :

// arr is array of items
// status if null mean select all by status
// paid if null mean select all by paid
// status and paid if null mean select all by status and paid
function filterItem(arr, status, paid){
    const result = [];
    arr.forEach((item) => {
         if (status && paid) {
                if (status === item.status
                     && paid === item.paid.toString()) {
                     result.push(item);
                }
         } 
         else if(status){
                 if (status === item.status) {
                      result.push(item);
                 }
         }
         else if(paid){
                 if (paid == item.paid.toString()) {
                       result.push(item);
                 }
         }
         else result.push(item);
    })
    return result;
}

in this function filterItem :

status is string and may null

paid is string and may null

expected output :

if status and paid is null console.log(filterItem(items, null, null));

[
   {
       id: 1,
       status: "active",
       paid: true,
       name: "item-1"
   },
   {
       id: 2,
       status: "active",
       paid: false,
       name: "item-2"
   },
   {
       id: 3,
       status: "not active",
       paid: false,
       name: "item-3"
   },
]

if paid null and status active console.log(filterItem(items, 'active', null))

[
   {
       id: 1,
       status: "active",
       paid: true,
       name: "item-1"
   },
   {
       id: 2,
       status: "active",
       paid: false,
       name: "item-2"
   }
]

and etc

I believe there is a short way, using es6 or lodash. I need your suggestion please review my simple code and is there a more simple code than mine?


Solution

  • You could filter like this:

    const items=[{id:1,status:"active",paid:true,name:"item-1"},{id:2,status:"active",paid:false,name:"item-2"},{id:3,status:"not active",paid:false,name:"item-3"},]
    
    function filterItem(arr, status, paid){
      return arr.filter(a =>
        (status === null || a.status === status) &&
        (paid === null || a.paid === paid)
      )
    }
    
    console.log(filterItem(items, "active", null))
    console.log(filterItem(items, null, false))
    console.log(filterItem(items, "active", true)) // both conditions
    console.log(filterItem(items, null, null)) // returns everything