Примечание. В этом руководстве я буду использовать синтаксис Typescript

Предположим, у вас есть массив строк, и вы хотите получить только уникальные значения из этого массива.

const array: string[] = [ 'Scooby', 'Dooby', 'Dooby', 'Doo' ];

Хороший, плохой и злой.

Подход первый: уродство

Самым простым способом может быть сохранение двух массивов: исходного массива и массива, предназначенного для уникальных значений, и добавление дополнительных значений в уникальный массив только в том случае, если мы подтвердили, что значение еще не существует. Мы делаем это с помощью вложенного цикла for:

const array: string[] = [ 'Scooby', 'Dooby', 'Dooby', 'Doo' ];
const uniques: string[] = [];
for (const value of array) {
    let exists = false;
    for (const unique of uniques) { 
        if (unique === value) {
            exists = true;
            break;
        }
    }
    if (!exists) { 
        uniques.push(value); 
    }
}

Технически это работает, но это еще и беспорядок.

Подход второй: плохой

Мы можем улучшить последний подход, используя встроенный метод Array includes :

const array: string[] = [ 'Scooby', 'Dooby', 'Dooby', 'Doo' ];
const uniques: string[] = [];
for (const value of array) {
    if (!uniques.includes(value)) { uniques.push(value); }
}retu

Это значительно сокращает код и является огромным улучшением.

Подход третий: хороший

Допустим, вы управляете несколькими массивами и хотите иметь возможность фильтровать их в любое время. Мы могли бы взять предыдущее решение, обернуть его функцией и вызвать эту функцию в любое время (что является абсолютно правильным решением). Если мы хотим развить наше мастерство программирования и превратить его в 11, мы можем создать собственный фильтр массива.

function uniqueFilter(value, index, self) {
    return self.indexOf(value) === index;
}
// ...
const array: string[] = [ 'Scooby', 'Dooby', 'Dooby', 'Doo' ];
const uniques: string[] = array.filter(uniqueFilter);

Теперь у нас есть определенная где-то функция uniquesOnly, которую мы можем передать в качестве параметра встроенной функции filter.

Как это работает

Функция filter передаст нам три параметра для использования:

  • value (текущее значение массива),
  • index (текущий индекс) и
  • self (массив)

Фильтр захватит первый индекс переданного значения, вызвав функцию indexOf в массиве. Затем он сравнивает это обнаруженное значение индекса с текущим итерируемым значением индекса.

В этом случае будет решено, что второй «Dooby» (с индексом 2) не совпадает с индексом первого вхождения «Dooby» (с индексом 1), поэтому он отфильтровывается.

Заключение

Теперь мы можем использовать нашу функцию uniqueFilter и применить ее к любому фильтру, где мы хотим извлечь уникальный массив.

Удачного кодирования!