Как оптимизировать функцию фильтрации массива по вхождению?
Всем привет. Исходный массив:
let arr = [ { id: 1, firstName: 'John', lastName: 'Smith' }, { id: 2, firstName: 'Brady', lastName: 'Dennis' }, { id: 3, firstName: 'Sandoval', lastName: 'Pratt' }, { id: 4, firstName: 'Davis', lastName: 'Andrews' } ] Свойства, по которым нужно отфильтровать: const filterBy = ['firstName', 'lastName']; Вхождения (условия) по которым фильтруем: const filterVal = ['joh', 'den']; Результат: /* output [ { id: 1, firstName: 'John', lastName: 'Smith' }, { id: 2, firstName: 'Brady', lastName: 'Dennis' } ] */ Решение: function solution(a) { return a.filter(item => { return filterBy.some(prop => { return filterVal.some(i => { return item[prop].toLowerCase().includes(i) }) }) }) } console.log(solution(arr)); Решение в плане сложности алгоритма не оптимальное. Подскажите, пожалуйста, как его оптимизировать? |
const arrayFilter = (arr, rules) => arr.filter(el => Object.keys(rules).some(key => rules[key](el[key]))); const rules = { firstName: v => v.toLowerCase().includes('joh'), lastName: v => v.toLowerCase().includes('den'), }; console.log(arrayFilter(arr, rules));:) Вариант const rules = { firstName: v => /joh/i.test(v), lastName: v => /den/i.test(v), }; |
Вполне себе оптимальное. Перебирается ровно столько сколько нужно.
Разве что вынести значение в переменную, чтоб лишний раз toLowerCase не делать: function solution(a) { return a.filter(item => filterBy.some(prop => { const value = item[prop].toLowerCase(); return filterVal.some(i => value.includes(i)); })); } console.log(solution(arr)); |
Часовой пояс GMT +3, время: 03:56. |