javascriptobjectfiltermassive

Filtering an array by multiple property values


I have an array of the form

var cars = [
   {name: "BMW X5", topsales: ["USA", "China", "Russia"], maxspeed: 250, users: ["teenage", "ladies", "mens"]}
   {name: "Volkswagen Touareg", topsales: ["USA", "Germany"], maxspeed: 240, users: ["teenage", "mens", "old mens"]}
   etc....
]

I am trying to filter, let's say like this:

var query = {
   topsales: ["USA", "China"],
   users: "teenage"
}
function nestedFilter(targetArray, filters) {
     var filterKeys = Object.keys(filters);
     return targetArray.filter(function (eachObj) {
         return filterKeys.every(function (eachKey) {
             if (!filters[eachKey].length) {
                 return true; 
             }
             return filters[eachKey].includes(eachObj[eachKey]);
          });
     });
};
goodresult = nestedFilter(cars, query);

But the function doesn't work as it should. If the object has one value in the property, then it filters, but if there are several of them, and I need at least one of them to satisfy the search, then it does not filter. Help who can please


Solution

  • You could check if query is an array and/or the value is an array and check accordingly.

    function nestedFilter(data, query) {
        const
            filters = Object.entries(query);
    
        return data.filter(o => filters.every(([k, v]) => Array.isArray(v)
            ? Array.isArray(o[k])
                ? v.some(s => o[k].includes(s))
                : v.includes(o[k])
            : Array.isArray(o[k])
                ? o[k].includes(v)
                : o[k] === v
        ));
    }
    
    const
        cars = [{ name: "BMW X5", topsales: ["USA", "China", "Russia"], maxspeed: 250, users: ["teenage", "ladies", "mens"] }, { name: "Volkswagen Touareg", topsales: ["USA", "Germany"], maxspeed: 240, users: ["teenage", "mens", "old mens"] }],
        query = { topsales: ["USA", "China"], users: "teenage" };
    
    console.log(nestedFilter(cars, query));