2017-12-09 10 views
-1

Wenn ich Array von Objekten habe.Filtern von JavaScript-Objekten mit Werten aus mehreren Arrays

var products = [{ 
     names: ["hammer", "nail", "rubber duck"], 
     colors: ["yellow", "red", "pink"] 
    }, 
    { 
     names: ["saw", "tractor", "bowling ball"], 
     colors: ["gray", "purple", "green"] 
    }] 

Dann habe ich Objekt mit Arrays von Filterwerten:

var filters = {names: ["saw", "bowling ball"], colors:["purple"]} 

Ich brauche die Objekte zu filtern, so dass, wenn ich keine Filter habe ich alle Objekte zurück. Wenn ich irgendwelche Filterwerte in "Namen" habe, bekomme ich Objekte mit passenden Namen zurück. Wenn ich irgendwelche Filterwerte in "Namen" und "Farben" habe, bekomme ich Objekte mit übereinstimmenden Werten auf beiden zurück.

Zum Beispiel: durch Filtern den gegebenen Array mit allen Elementen mit dem Objekt für den gewünschten Artikel und erhalten die Schlüssel davon

var filters = {names: ["saw", "bowling ball"], colors:["purple"]} 

zurückkehren würde

[{ 
names: ["saw", "tractor" "bowling ball"], 
colors: ["gray", "purple", "green"] 
}] 
+1

Also, was haben Sie versucht, so weit? Zeigen Sie den Code – dashton

Antwort

0

Sie array#filter können durch Ihre products Array zu durchlaufen und im Inneren Sie die Existenz von name und color mit array#some und array#includes überprüfen können.

var products = [{ names: ["hammer", "nail", "rubber duck"], colors: ["yellow", "red", "pink"] }, { names: ["saw", "tractor", "bowling ball"],colors: ["gray", "purple", "green"] }], 
 
    filters = {names: ["saw", "bowling ball"], colors:["purple"]}; 
 
var result = products.filter(({names, colors}) => { 
 
    return filters.names.some(name => names.includes(name)) && filters.colors.some(color => colors.includes(color)); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

Sie einen verschachtelten Ansatz könnten nimm die Arrays und schaue ob der Wert in der Liste des Items mit dem gleichen Schlüssel ist.

var products = [{ names: ["hammer", "nail", "rubber duck"], colors: ["yellow", "red", "pink"] }, { names: ["saw", "tractor", "bowling ball"], colors: ["gray", "purple", "green"] }], 
 
    filters = { names: ["saw", "bowling ball"], colors: ["purple"] }, 
 
    result = products.filter(function (p) { 
 
     return Object.keys(filters).every(function (k) { 
 
      return filters[k].some(function (v) { 
 
       return p[k].indexOf(v) !== -1; 
 
      }); 
 
     }); 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
const filterProducts = (filter, products) => { 
     let len=products.length,i=0, 
      filteredProducts = []; 

     for(;i<len;i++) { 
      let product = products[i]; 
      if(filters.names) { 
       let names = getMatch(filters.names, product.names); 
       if(names) { 
        if(!filteredProducts[i]) filteredProducts[i] = {}; 
        filteredProducts[i].names = names; 
       }; 
      } 
      if(filters.colors) { 
       let colors = getMatch(filters.colors, product.colors); 
       if(colors) { 
        if(!filteredProducts[i]) filteredProducts[i] = {}; 
        filteredProducts[i].colors = colors; 
       }; 
      } 
     } 

     if(filteredProducts.length) return filteredProducts; 
     return products; 
    } 

    const getMatch = (filter, values) => { 
     let filterLength = filter.length; 
     for(let i=0;i<filterLength;i++) { 
      if(values.indexOf(filter[i]) !== -1) return values; 
     } 
    } 

    let filtered = filterProducts(filters, products); 
    console.log(filtered); 
Verwandte Themen