Come filtrare un arrays / object controllando più valori

Sto giocando in giro con gli arrays che cercano di capirli più perché ho tante volte a lavorare con loro molto recentemente. Ho ottenuto questo caso in cui desidero cercare un arrays e confrontare i suoi valori di elemento con un'altra matrix che contiene i valori di alcuni filtri selezionati.

Ad esempio, se seleziono 3 filtri, voglio scrivere le corrispondenze in una nuova matrix – solo quelle corrispondenti a tutti i tre filtri.

Per una maggiore comprensione ho impostato un esempio su http://jsfiddle.net/easwee/x8U4v/36/

Il codice è:

var workItems = [ { "id": 2616, "category": ".category-copy .category-beauty .category-fashion"}, //this is a match { "id": 1505, "category": ".category-beauty"}, // NOT { "id": 1500, "category": ".category-beauty .category-fashion"}, // NOT { "id": 692, "category": ".category-stills .category-retouching"}, // NOT { "id": 593, "category": ".category-beauty .category-capture .category-fashion .category-product .category-stills .category-stills-retouching "}, // NOT { "id": 636, "category": ".category-beauty .category-copy .category-fashion"}, //this is a match { "id": 547, "category": ".category-fashion .category-lifestyle .category-stills .category-stills-retouching "}, // NOT { "id": 588, "category": ".category-capture .category-recent-work .category-copy .category-beauty .category-fashion"} //this is a match ]; var filtersArray = [".category-beauty", ".category-fashion", ".category-copy"]; var i; for (i = 0; i < filtersArray.length; ++i) { var searchString = filtersArray[i]; console.log('Searching for: ' + searchString); var filtered = $(workItems).filter(function(){ return this.category.indexOf(searchString); }); } console.log('Filtered results: ' + JSON.stringify(filtered, null, 4)); 

Ho anche provato con

 filtered = $.grep(workItems, function(element, index){ return element.category.indexOf(filtersArray[i]); }, true); 

ma corrisponde solo al primo filter e solo se è all'inizio di workItems.category

Ho provato molte soluzioni diverse ma non posso realmente fare questo lavoro. Quale function devo utilizzare per restituire il risultato desiderato?

È ansible utilizzare il metodo .filter() dell'object Array :

 var filtered = workItems.filter(function(element) { // Create an arrays using `.split()` method var cats = element.category.split(' '); // Filter the returned arrays based on specified filters // If the length of the returned filtered arrays is equal to // length of the filters arrays the element should be returned return cats.filter(function(cat) { return filtersArray.indexOf(cat) > -1; }).length === filtersArray.length; }); 

http://jsfiddle.net/6RBnB/

Alcuni browser vecchi come IE8 non supportno il metodo .filter() dell'object Array , se si utilizza jQuery è ansible utilizzare il metodo .filter() dell'object jQuery.

Versione jQuery:

 var filtered = $(workItems).filter(function(i, element) { var cats = element.category.split(' '); return $(cats).filter(function(_, cat) { return $.inArray(cat, filtersArray) > -1; }).length === filtersArray.length; }); 

Penso che tu abbia bisogno di Array.prototype.filter

Altro su questo qui:

Javascript: Come filtrare l'arrays di oggetti in base agli attributi?