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?
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