Boky
Boky

Reputation: 12074

Filtering object with another object in javascript

My code is as follows :

    import { filter_names } from './search/filterActions';

export const string_names = {
    diesel: 'diesel',
    benzine: 'benzine',
    transmissionManual: 'manual',
    transmissionAutomatic: 'automatic'
};

function filterItem(filter, car) {
    switch(filter.name) {

        case filter_names.priceRange:
            return filter.values.filter((v) => v.active).every((v) => (car.price <= v.high && car.price >= v.low));
        case filter_names.mileage:
            return filter.values.filter( v => v.active).every( v => (car.mileage >= v.low && car.mileage <= v.high));
        case filter_names.year:
            return filter.values.filter(v => v.active).every(v => (parseInt(car.initialRegistration.substr(car.initialRegistration.length - 4)) >= v.low && parseInt(car.initialRegistration.substr(car.initialRegistration.length - 4)) <= v.high));
        case filter_names.fuel:
            return filter.values.every(v => {
                if(v.checkboxBenzine && v.checkboxDiesel) return car;
                if(v.checkboxBenzine) return car.fuel.toLowerCase() == string_names.benzine;
                if(v.checkboxDiesel) return car.fuel.toLowerCase() == string_names.diesel;
            });
        case filter_names.transmission:
            return filter.values.every(v => {
                if(v.checkboxManual && v.checkboxAutomatic) return car;
                if(v.checkboxAutomatic) return car.transmission.toLowerCase() == string_names.transmissionAutomatic;
                if(v.checkboxManual) return car.transmission.toLowerCase() == string_names.transmissionManual;
            });
        case filter_names.make:
            //console.log(filter);
            //console.log(car);
            console.log(filter.values.filter(v => v).every(v => car.make.indexOf(v.model) !== -1));
            return true;
        default:
            return true;
    }
}

export function filterCars(cars, filters){
    if(!filters) return cars;
    return cars.filter((car) => filters.every((filter) => filterItem(filter, car)));
}

The parameters filter and cars are as follows :

let filter = {
  name: "MAKE", values: [{ Golf: {active: true, make: "Volkswagen", model: "Golf"},
                           Passat: {active: true, make: "Volkswagen", model: "Passat"},
                           Q5: {active: true, make: "Audi", model: "Q5"}
                         }
                        ]
}

let cars = [
  {id: 20,make: "Audi"},
  {id: 21, make: "Skoda"},
  {id: 22,make: "Audi Q5"},
  {id: 23,make: "A1"},
  {id: 24,make: "Volkswagen Skoda"},
  {id: 25,make: "Audi A7"},
  {id: 26,make: "Audi A5"}  
]

How can I loop through filters and check if any model from filter values exists in cars make?

I have problem in filter_names.make case.

The wanted result is in this case : [{id: 22,make: "Audi Q5"}]

Upvotes: 0

Views: 111

Answers (1)

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

According to your condition:

"check if any model from filter values exists in cars make"

The solution using Object.keys and Array.some functions:

var values = filter.values[0],
    carExists = Object.keys(values).some(function (k) {
        return (values[k].make + " " + values[k].model) === cars.make;
    });

console.log(carExists);  // true

Upvotes: 1

Related Questions