#javascript #performance #optimization #filter
Вопрос:
Привет недавно мне был задан очень интересный вопрос: Предоставление набора данных
data = [{name: "gem1", year: 2013, color:"yellow"}, {name: "gem2", year: 2013, color:"blue"}, {name: "gem3", year: 2021, color:"blue"}]
И набор фильтров
filters = [{k: "color", v: "yellow"}]
Показывать данные, исключенные фильтром, например:
getExclusive(data, filters) = [{name: "gem2", year: 2013, color:"blue"}, {name: "gem3", year: 2021, color:"blue"}]
Также дополнительным является то, что в самом вопросе упоминалось, что очень сырой метод:
filter.forEach(filter => {data = data.filter(datum => {return datum[filter.k] == filter.v})})
Это СЛИШКОМ МЕДЛЕННО. И цель состоит в том, чтобы оптимизировать его.
Имейте в виду, что каждый объект в данных будет иметь неизвестное количество ключей, и имена ключей также являются динамическими, например: obj1 может содержать только {фамилия: «последний», имя: «первый»}, а obj2 может содержать только {модель: «Jeep», год выпуска: 2021, цвет: «белый»})
Я думал, что причина, по которой это происходит медленно, заключается в том, что большая буква » О » идет F * D
.
И я хочу преобразовать фильтры в a Map<string, Set>
, чтобы для всех данных они выглядели как местоположение в O(1).
Но потом я понял, что ошибался. Потому что таким образом ему нужно пройти через каждый ключ в каждом объекте, чтобы увидеть, попадает ли он в фильтр. Поэтому становится F D * <avg key numbers in data>
ясно , что может быть еще хуже, если номер ключа настолько велик?
Итак, есть ли какой-либо другой способ абсолютно оптимизировать его, или, может быть, это просто открытый вопрос без определенного ответа?
Обратите внимание, что этот вопрос написан на JavaScript. Поэтому я не знаю, будут ли рассматриваться какие-либо внутренние API