Фильтрация списка с использованием раскрывающегося значения выбора в JavaScript - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть массив объектов.Фильтрация массива объектов на основе выбора раскрывающегося значения.

const itemsList=[{
"id":"123",
"problems":{
    "causes":[ 
         {
        "SSEnabled": true,
        "IndusEnabled": false,
        "LogEnabled": true
        }
    ]
}
},
{
"id":"234",
"problems":{
    "causes":[
          {
        "SSEnabled": false,
        "IndusEnabled": false,
        "LogEnabled": true
        }
    ]
}
}]

У нас есть раскрывающийся список для фильтрации причины SSEnabled.Варианты раскрывающегося списка: «показать», «nofilter», «исключить».

Необходимо отфильтровать список на основе раскрывающегося списка.

Если выбрана опция «show» в раскрывающемся списке «SSEnabled», результатом будет элемент списка, в котором «SSEnabled»: «true» (т. Е. Id: «123»)

Если выбрано «исключение» причины «SSEnabled», то результатом списка должен быть элемент списка, в котором «SSEnabled: false» (т. Е. Id: «234»)

Если выбран «nofilter», он долженигнорировать фильтр.(т.е. 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.log(itemsList, 'filtered List');
}

Но список не фильтруется.Пожалуйста, помогите в фильтрации.

1 Ответ

0 голосов
/ 18 декабря 2018

Что бы сделать это, можно определить поиск функций, которые реализуют вашу логику, а затем передать правильную функцию в 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.log(SSEnabled)

let SS_not_enabled = itemsList.filter(item => item.problems.causes.some(filters('exclude', 'SSEnabled')) )
console.log(SS_not_enabled)

let LogEnabled = itemsList.filter(item => item.problems.causes.some(filters('show', 'SSEnabled')) )
console.log(LogEnabled)
...