Залишити унікальні елементи масиву
Давайте подивимося, наскільки швидко він буде працювати.
Припустимо, в масиві 100 елементів. Якщо всі вони однакові, то result буде складатися з одного елемента і вкладений цикл буде виконуватися відразу. У цьому випадку все добре.
А якщо все, або майже все елементи різні?
В цьому випадку для кожного елемента знадобиться обійти весь поточний масив результатів, після чого - додати в цей масив.
- Для першого елемента - це обійдеться в 0 операцій доступу до елементів result (він поки порожній).
- Для другого елементу - це обійдеться в 1 операцію доступу до елементів result.
- Для третього елемента - це обійдеться в 2 операції доступу до елементів result.
- ... Для n-го елемента - це обійдеться в n-1 операцій доступу до елементів result.
Всього 0 + 1 + 2 + ... + n-1 = (n-1) * n / 2 = n 2/2 - n / 2 (як сума арифметичної прогресії), тобто кількість операцій зростає приблизно як квадрат від n.
Це дуже швидке зростання. Для 100 елементів - 4950 операцій, для 1000 - 499500 (по формулі вище).
Тому таке рішення підійде тільки для невеликих масивів. Замість вкладеного for можна використовувати і arr.indexOf. ситуація від цього не зміниться, так як indexOf теж шукає перебором.
Рішення з об'єктом (швидке)
Рішення з об'єктом (швидке)
Найкраща техніка для вибору унікальних рядків - використання допоміжного об'єкта obj. Адже назва властивості в об'єкті, з одного боку - рядок, а з іншого - завжди унікально. Повторна запис в властивість з тим же ім'ям перезапише його.
Наприклад, якщо "харе" потрапило в об'єкт один раз (obj [ "харе"] = true), то другий такий же присвоювання нічого не змінить.
Рішення нижче створює об'єкт obj = <> і записує в нього все рядки як імена властивостей. А потім збирає властивості з об'єкта в масив через for..in. Дублікатів вже не буде.