Javascript: фильтровать массив объектов по нескольким значениям - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь отфильтровать сетку, используя несколько фильтров различных типов (логические, совпадения строк и т. Д.). Сетка - это просто массив JSON. Я должен фильтровать каждый раз, когда значение фильтра установлено или удалено (т. Е. Флажок установлен или не установлен). Я пытался сделать это, используя очень сложный оператор switch, но затем я нашел этот пост от @ ori-drori, который объясняет, как это сделать, используя гораздо более простую карту filterHandlers. Однако, когда я запускаю этот код, я не получаю желаемых результатов, и я озадачен, почему. Вот что я получил:

filterGrid(rows) {
   const filterList = [
     { 'open': this.onlyOpen },
     { 'assmtComplete': this.onlyAssmtCompleted },
     { 'bureau': this.selectedBureau ? this.selectedBureau : '' },
     { 'unit': this.selectedUnit ? this.selectedUnit : '' }
   ];
   const filterHandlers = new Map([
     [
      'open',
      (ref) => !ref.cwsClosureReasonDescription
     ],
     [
      'assmtComplete',
      (ref) => ref.safetyAsstComplDate !== null
     ],
     [ 
      'bureau', 
      (ref, val) => ref.bureauCode === val 
     ],
     [ 
      'unit', 
      (ref, val) => ref.unitID === val 
     ],
   ]);

   const applyFilters = (arr, filters) => {
      const filterKeys = Object.keys(filters);  
      return arr.filter(o => filterKeys.every((key) => {
        const handler = filterHandlers.get(key);  // THIS returns undefined every time
        return !handler || handler(o[key], filters[key]);
      }));
   };

   const result = applyFilters(rows, filterList);
   console.log(result);
 }

Пример объекта в «строках» может выглядеть следующим образом:

{
   createdDate: "2019-10-18T10:56:43.477"
   closureReasonDescription: null
   refNumber: "1231-3213-2132-1321321"
   incidentZipCode: "92108"
   intakeDate: "2019-10-19T00:56:24.953"
   referralId: 1461
   bureauCode: "S"
   unitID: 1017
   safetyAsstComplDate: null
   taskTypeId: null
}

Как видно из комментария в приведенном выше коде,эта строка в applyFilters всегда неопределена. Я пробовал несколько способов получить обработчик от этого, но я не уверен, какой ключ должен быть - целое число или строка? Любые советы будут с благодарностью!

1 Ответ

1 голос
/ 21 октября 2019

filterKeys (определяется Object.keys(filterList)) - это массив числовых ключей (["0", "1", "2", "3"]), поскольку filterList - это массив, ключи которого являются числовыми индексами.

Я думаю, вы хотите filterKeysбыть ключами каждого объекта в массиве filterList. Этого проще всего добиться, сделав filterList единым объектом со многими ключами вместо массива объектов с одним ключом каждый:

const filterList = {
    'open': this.onlyOpen,
    'assmtComplete': this.onlyAssmtCompleted,
    'bureau': this.selectedBureau ? this.selectedBureau : '',
    'unit': this.selectedUnit ? this.selectedUnit : ''
];
...