У меня есть массив объектов. Фильтрация массива объекта по выбору раскрывающегося значения.
const itemsList=[{
"id":"123",
"problems":{
"causes":[
{
"SSEnabled": true,
"IndusEnabled": false,
"LogEnabled": true
}
]
}
},
{
"id":"234",
"problems":{
"causes":[
{
"SSEnabled": false,
"IndusEnabled": false,
"LogEnabled": true
}
]
}
}]
у нас есть раскрывающийся список для фильтрации причины SSEnabled. Возможные варианты раскрывающегося списка: «показать», «без фильтра», «исключить».
Необходимо отфильтровать список на основе раскрывающегося списка.
Если выбрана опция «показать» в раскрывающемся списке «SSEnabled», результатом должен быть элемент списка, в котором «SSEnabled»: «true» (т.е. id: «123»)
Если выбрано «исключить» причины «SSEnabled», результатом должен быть элемент списка, в котором «SSEnabled: false» (т. Е. Id: «234»)
Если выбран вариант «без фильтра», он должен игнорировать фильтр. (т.е. id: «123», id: «234»)
filterList(filterType, filterValue, itemsList) {
// filterType : SSEnabled (type of dropdown changed)
//filterValue : show, exclude , no filter
itemsList.map((items) => {
if (
items &&
items.problems &&
items.problems.causes &&
items.problems.causes.length
) {
items.problems.causes.filter((cause) => {
if (cause[filterType] === true && filterValue === 'show') {
return true;
}
if (cause[filterType] === false && filterValue === 'exclude') {
return true;
}
});
}
});
console.info(itemsList, 'filtered List');
}
Но список не фильтруется. Помогите пожалуйста в фильтрации.
то внутри вашего метода map
вы ничего не возвращаете
Array.map - неправильный инструмент. Array.map предназначен для тех случаев, когда вам нужен выходной массив с таким же количеством элементов, как и входной.
Для этого нужно определить поиск функций, реализующих вашу логику, а затем передать правильную функцию в some()
(или find()
). Вы можете передать его в field
, например show
или exclude
, и в key
, который вы хотите фильтровать, например SSEnabled
.
const itemsList=[{"id":"123","problems":{"causes":[ {"SSEnabled": true,"IndusEnabled": false,"LogEnabled": true}]}},{"id":"234","problems":{"causes":[{"SSEnabled": false,"IndusEnabled": false,"LogEnabled": true}]}}]
// implement the selection logic based on keyword
// will return items where some of the cause match the condition
const filters = (field, key ) => {
let options = {
show: (i) => i[key] == true,
nofilter: (i) => true,
exclude: (i) => i[key] == false
}
return options[field]
}
// filter using the above function:
let SSEnabled = itemsList.filter(item => item.problems.causes.some(filters('show', 'SSEnabled')) )
console.info(SSEnabled)
let SS_not_enabled = itemsList.filter(item => item.problems.causes.some(filters('exclude', 'SSEnabled')) )
console.info(SS_not_enabled)
let LogEnabled = itemsList.filter(item => item.problems.causes.some(filters('show', 'SSEnabled')) )
console.info(LogEnabled)
Может ли SSEnabled в объекте фильтров быть динамическим ?? так как у меня есть больше таких атрибутов для фильтрации, как 'indusEnabled', 'logisticsEnabled'.
@ user8599269, конечно, вместо простого поиска объекта сделайте его функцией, которая принимает атрибут, который вы ищете. См. Редактировать.
использовать метод фильтра массива