Я пытаюсь отфильтровать сетку, используя несколько фильтров различных типов (логические, совпадения строк и т. Д.). Сетка - это просто массив 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 всегда неопределена. Я пробовал несколько способов получить обработчик от этого, но я не уверен, какой ключ должен быть - целое число или строка? Любые советы будут с благодарностью!