2016-09-08 7 views
0

Mein Code ist wie folgt:Filtering Objekt mit einem anderen Objekt in JavaScript

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

Der Parameter Filter und Autos sind wie folgt:

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

Wie kann ich durch Filter Schleife und prüfen, ob jedes Modell aus Filterwerten besteht in Autos machen?

Ich habe ein Problem in filter_names.make Fall.

Das gewünschte Ergebnis ist in diesem Fall: [{id: 22,make: "Audi Q5"}]

+0

was hast du probiert? Wie sollte das Ergebnis aussehen? Wie sollte der Filter funktionieren? Warum ist 'Autos' kein Array? –

+0

Schleife durch 'filter.values' und überprüfe' jedes' Modell mit cars.make. z.B. 'cars.make == this.model' – BCoder

+0

@NinaScholz Aktualisiert. – Boky

Antwort

1

nach Ihrem Zustand:

"überprüfen, ob jedes Modell von Filterwerten in Autos vorhanden machen"

Die Lösung mit Object.keys und Array.some Funktionen:

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 
+0

Danke Kumpel. Ich habe es ein wenig geändert 'let values ​​= filter.values ​​[0]; return Object.keys (Werte) .some (v => car.make.indexOf (Werte [v] .model)! == -1); 'und es funktioniert wie es sollte. – Boky

Verwandte Themen