TGViewer
Free React For Beginners Free React For Beginners @reactbeginners · 3.04K subscribers
Post #574 1.7K
Free React For Beginners N*M (1/3), або дайте мені 1000 ноутбуків Сьогодні трохи поговоримо про оптимізацію та складність алгоритму на прикладі магазину з ноутбуками. Уявіть собі що вам прилетіла задача відобразити таблицю з ноутбуками, а бекенд вам повертає два окремі масиви -…
Як цьому запобігти? (2/3)

Для того щоб запобігти такій ситуації існує старий і прекрасний лайфхак - купити кращий комп'ютер - використати Map.

Тобто трансформувати масив сутностей по якому у нас ведеться пошук у словник. Для того щоб знайти елемент у масиві, в гіршому випадку потрібно прочесати весь масив (N операцйі де N довжина масиву). А для словника це умовно одна операція, тобто складність змінюється з N на 1. Що, на попередньому прикладі дає нам 2000 операцій замість 120 мільйонів. Не так і погано?

Реалізувати це дуже просто:

// Перетворимо масив цін на словник цін
// Де ключем буде id ноутбуку
const pricesMap = prices.reduce((acc, price) => {
const { entityId } = price;
acc.has(entityId)
? acc.get(entityId)?.push(price)
: acc.set(price.entityId, [price]);

return acc;
}, new Map<number, PriceHistory[]>());


В цьому коді ми проходимо по усім цінам і створюємо на їх основі словник. Все що нам залишається це звернутися до цього словника під час формування моделі ноутбуку:

return notes.map((notebook) => ({
...notebook,
prices: pricesMap.get(notebook.id),
}));


Як бачите - не складно. Але розмови, коли ми говоримо про швидкодію, нічого не варті - завжди треба міряти. Тому я зібрав цей код, протестував його на JsBench і вийшло, що перша реалізація на 98% повільніша ніж версія з Map. Якби ноутбуки продавалися з такою знижкою я б купив собі два :)

Так що, тепер переводимо все на мапи?

@reactbeginners
  • 👍 27
  • 🔥 10
More from @reactbeginners
  1. Sep 29, 2026Як і обіцяв - про БЗВП по свіжих слідах (і заодно про процес). У знайомого злетіло бронюва…
  2. Sep 26, 2026Думаю багатьом буде цікаво щось дізнатися про розробоку в ЗСУ Спробою розповісти трохи тог…
  3. Sep 24, 2026Всім привіт. Давно не бачилися, але до телеграму руки все ніяк не доходили. В лінкедині я…
  4. May 24, 2026Київ, співчуваю. Сам сьогодні в цю ніч був на лукьянівці. Як на мене, найважча ніч за всі.…
  5. Dec 31, 2025З новим Роком. Нехай це буде останній рік війни. А росія нехай отримує те на що заслужила.…
  6. Nov 29, 2025Сподіваюся всі живі. Схоже що це був рекордний наліт. Як бачите - путін не зацікавлений в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →