# Решение перебором (медленное) Пройдём по массиву вложенным циклом. Для каждого элемента мы будем искать, был ли такой уже. Если был -- игнорировать: ```js //+ run function unique(arr) { var obj = {}; var result = []; nextInput: for(var i=0; i
  • Для первого элемента -- это обойдётся в `0` операций доступа к элементам `result` (он пока пустой).
  • Для второго элемента -- это обойдётся в `1` операцию доступа к элементам `result`.
  • Для третьего элемента -- это обойдётся в `2` операции доступа к элементам `result`.
  • ...Для n-го элемента -- это обойдётся в `n-1` операций доступа к элементам `result`.
  • Всего 0 + 1 + 2 + ... + n-1 = (n-1)*n/2 = n2/2 - n/2 (как сумма арифметической прогрессии), то есть количество операций растёт примерно как квадрат от `n`. Это очень быстрый рост. Для `100` элементов -- `4950` операций, для `1000` -- `499500` (по формуле выше). Поэтому такое решение подойдёт только для небольших массивов. Вместо вложенного `for` можно использовать и `arr.indexOf`, ситуация от этого не поменяется, так как `indexOf` тоже ищет перебором. # Решение с объектом (быстрое) Наилучшая техника для выбора уникальных строк -- использование вспомогательного объекта. Ведь название свойства в объекте, с одной стороны -- строка, а с другой -- всегда уникально. Повторная запись в свойство с тем же именем перезапишет его. Например, если `"харе"` попало в объект один раз (`obj["харе"] = true`), то второе такое же присваивание ничего не изменит. Решение ниже создаёт объект `obj = {}` и записывает в него все строки как имена свойств. А затем собирает свойства из объекта в массив через `for..in`. Дубликатов уже не будет. ```js //+ run function unique(arr) { var obj = {}; for(var i=0; i