Всякий раз, когда вы пытаетесь провести какую-либо оптимизацию, вы обычно торгуете между скоростью и памятью.Но сначала давайте проанализируем ваш текущий метод:
// don't need to worry here as your filter set is small
let activefilters = this.state.filters.map((item) => item.selected && item.filter)
let markers = this.state.allMarkers
let filteredmarkers = markers
// will run totalMarkers * activeFilters * filtersPerMarker
.map((item) =>
activefilters.some(r => item.filter.includes(r)) && item
)
// will run totalMarkers
.filter((item) => item)
Итак, поскольку у вас есть всего несколько фильтров, если вы хотите увеличить количество маркеров, производительность должна возрастать более или менее линейно по сложности, и это нормально.Это означает, что такие вещи, как маски и т. Д., Приведут вас к небольшому приросту производительности.
Если вы действительно хотите оптимизировать это, вы будете стремиться к O (1), которого вы могли бы достичь с помощью кэширования.Чтобы сделать это, вы в основном реструктурируете свои данные таким образом, чтобы вы могли выполнить мгновенный поиск.Если ваши маркеры статичны, то это нормально, но если вы часто добавляете и удаляете маркеры (или меняете их соответствующие фильтры), вам потребуется стратегия для восстановления ваших данных.Вы можете сделать что-то вроде следующего:
// run this once, and update when markers are added/removed or marker filters change
const cache = {}
state.allMarkers.forEach(marker => {
const id = marker.filter.join('-')
if(!cache[id]){ cache[id] = [] }
cache[id].push(marker)
})
Теперь, чтобы получить отфильтрованные результаты, вы просто ищите кэш с измененным идентификатором.
const filterId = this.state.filters
.filter(item => item.selected)
.map(item => item.filter)
.join('-')
const filteredMarkers = cache[filterId] || []
Вероятно, лучшеспособы обработки идентификаторов, но, надеюсь, вы поймете идею.
Дело в том, что это зависит от того, как ваши пользователи взаимодействуют с данными, и сколько данных у вас есть.Опять же, 1000 достаточно мал, чтобы не заметить никакой разницы в выборе алгоритма, и выполнение чего-либо большего, чем простой фильтр, который вы используете, будет усложнять вещи без необходимости.Также более вероятно, что любые проблемы с производительностью возникнут из-за рендеринга больших наборов, а не их организации.
Другими словами, пишите самый простой и читаемый код и оптимизируйте его только в том случае, если у вас есть действительно веские причины(то есть вы оценили и выяснили фактическое узкое место, если оно вообще у вас есть).Потратьте больше времени на то, чтобы сделать ваше приложение прекрасным!