Залишити унікальні елементи масиву

Давайте подивимося, наскільки швидко він буде працювати.

Припустимо, в масиві 100 елементів. Якщо всі вони однакові, то result буде складатися з одного елемента і вкладений цикл буде виконуватися відразу. У цьому випадку все добре.

А якщо все, або майже все елементи різні?

В цьому випадку для кожного елемента знадобиться обійти весь поточний масив результатів, після чого - додати в цей масив.

  1. Для першого елемента - це обійдеться в 0 операцій доступу до елементів result (він поки порожній).
  2. Для другого елементу - це обійдеться в 1 операцію доступу до елементів result.
  3. Для третього елемента - це обійдеться в 2 операції доступу до елементів result.
  4. ... Для 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. Дублікатів вже не буде.