在javascript中使用另一个对象过滤对象

时间:2016-09-08 07:22:43

标签: javascript arrays object

我的代码如下:

    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)));
}

参数过滤器和汽车如下:

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"}  
]

如何循环过滤器并检查汽车中是否存在过滤器值中的任何模型?

我在 filter_names.make 案例中遇到问题。

在这种情况下,想要的结果是:[{id: 22,make: "Audi Q5"}]

1 个答案:

答案 0 :(得分:1)

根据你的情况:

  

&#34;检查汽车制造&#34;

中是否存在来自过滤器值的任何模型

使用Object.keysArray.some函数的解决方案:

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