Примечание. В этом руководстве я буду использовать синтаксис 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
и применить ее к любому фильтру, где мы хотим извлечь уникальный массив.
Удачного кодирования!