Как фильтровать массив/объект, проверяя несколько значений
Я играю с массивами, пытаясь понять их больше, так как в последнее время я часто работаю с ними.
Я получил этот случай, когда хочу найти массив и сравнить его значения с другим массивом, который содержит значения некоторых выбранных фильтров.
Например, если я выбираю 3 фильтра, я хочу, чтобы позже писать совпадения в новом массиве - только те, которые соответствуют всем 3 фильтрам.
Для более легкого понимания я установил пример на http://jsfiddle.net/easwee/x8U4v/36/
Код:
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));
Я также пробовал с помощью
filtered = $.grep(workItems, function(element, index){
return element.category.indexOf(filtersArray[i]);
}, true);
но он соответствует только первому фильтру, и только если он в начале workItems.category
Я пробовал много разных решений, но не могу сделать эту работу. Какую функцию следует использовать для возврата желаемого результата?
Ответы
Ответ 1
Вы можете использовать метод .filter()
объекта Array
:
var filtered = workItems.filter(function(element) {
// Create an array using `.split()` method
var cats = element.category.split(' ');
// Filter the returned array based on specified filters
// If the length of the returned filtered array is equal to
// length of the filters array the element should be returned
return cats.filter(function(cat) {
return filtersArray.indexOf(cat) > -1;
}).length === filtersArray.length;
});
http://jsfiddle.net/6RBnB/
Некоторые старые браузеры, такие как IE8, не поддерживают метод .filter()
объекта Array
, если вы используете jQuery, вы можете использовать метод .filter()
объекта jQuery.
версия 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;
});
Ответ 2
Вы можете использовать.filter() с булевыми операторами, т.е. &&:
var find = my_array.filter(function(result) {
return result.param1 === "srting1" && result.param2 === 'string2';
});
return find[0];
}
Ответ 3
Мне кажется, вам нужно Array.prototype.filter
Подробнее об этом здесь:
Javascript: как фильтровать массив объектов на основе атрибутов?
Ответ 4
Выберите все, кроме яблока, банана => Я использую встроенную функцию поиска
const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];
let geko = fruits.filter(val => 'apple,banana'.search(val) < 0);
// write result in console
console.log(geko);
Ответ 5
workItems.filter(val => filtersArray.indexOf(val.category) >= 0);
// write result in console
console.log(geko);