Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.08.2022, 13:38
Аспирант
Отправить личное сообщение для dc65k Посмотреть профиль Найти все сообщения от dc65k
 
Регистрация: 19.05.2020
Сообщений: 46

Как оптимизировать функцию фильтрации массива по вхождению?
Всем привет. Исходный массив:
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));


Решение в плане сложности алгоритма не оптимальное. Подскажите, пожалуйста, как его оптимизировать?
Ответить с цитированием
  #2 (permalink)  
Старый 18.08.2022, 16:28
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

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),
};

Последний раз редактировалось Vlasenko Fedor, 18.08.2022 в 16:50. Причина: Добавил пример фильтра
Ответить с цитированием
  #3 (permalink)  
Старый 18.08.2022, 16:37
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Вполне себе оптимальное. Перебирается ровно столько сколько нужно.
Разве что вынести значение в переменную, чтоб лишний раз 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));
__________________
29375, 35

Последний раз редактировалось Aetae, 18.08.2022 в 16:41.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имя функции внутри функции не используя callee drwhite Общие вопросы Javascript 39 12.02.2020 22:48
Как создать глобальную функцию внутри другой функции? sovsem-nub Элементы интерфейса 2 18.01.2020 15:50
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как назвать функцию? mrtarantul Оффтопик 12 10.08.2013 16:26
как реализовать передачу функции в функцию?? czp Общие вопросы Javascript 10 29.11.2011 19:21