In the code below, I apply filter on array based on other arrays. For example : Filter data array based on property names from cols and values from values array.
const
data = [{ name: "Tiger Nixon", position: "Accountant", salary: 10800, start_date: "2011\\/04\\/25", office: "Edinburgh", rating: 5421 }, { name: "Garrett Winters", position: "Accountant", salary: 170750, start_date: "2011\\/07\\/25", office: "Tokyo", rating: 8422 }, { name: "Garrett Winters", position: "Analyst", salary: 170750, start_date: "2011\\/07\\/25", office: "Tokyo", rating: 8422 }, { name: "Ashton Cox", position: "Junior Technical Author", salary: 86000, start_date: "2009\\/01\\/12", office: "San Francisco", rating: 1562 }, { name: "Cedric Kelly", position: "Senior Javascript Developer", salary: 433060, start_date: "2012\\/03\\/29", office: "Edinburgh", rating: 6224 }],
cols = ['name', 'position'],
values = ['Garrett Winters', 'Accountant'],
result = data.filter(o => cols.every((k, i) => o[k] === values[i]));
console.log(result);
The above code is working fine. But if I have nested array for numeric in values (see below). I want to accommodate this condition salary >= nestedarray[0] && salary <= nestedarray[1]
cols = ['salary', 'position']
values = [[50000,500000], 'Accountant']
I tried this but not working –
result = data.filter(o => cols.every((k, i) => if(Array.isArray(values[i]) {o[k] >= values[i][0] && o[k] <= values[i][1] } else {o[k] === values[i]}))
>Solution :
You have to use the ternary operator to perform a conditional in an expression, not if.
result = data.filter(o => cols.every((k, i) =>
Array.isArray(values[i]) ?
o[k] >= values[i][0] && o[k] <= values[i][1] :
o[k] === values[i]
));