Как проверить, содержит ли массив строку в TypeScript?
Проблема: Я использую Angular 2.0 и у меня есть массив, который выглядит следующим образом:
var channelArray: Array<string> = ['one', 'two', 'three'];
Мне нужно проверить, содержит ли массив channelArray
строку 'three'
с помощью TypeScript. Как это можно сделать?
5 ответ(ов)
Если ваш код основан на ES7 (или более поздних версиях), вы можете использовать метод includes
для проверки наличия элемента в массиве:
channelArray.includes('three'); // вернёт true или false
Если же вы используете устаревший браузер, например, Internet Explorer, и не делаете транспиляцию кода с помощью Babel, вам потребуется использовать метод indexOf
:
channelArray.indexOf('three') !== -1; // вернёт true или false
Метод indexOf
возвращает позицию элемента в массиве, поэтому мы используем сравнение !== -1
, чтобы проверить, найден ли элемент, так как если он находится на первой позиции, indexOf
вернёт 0 (что не равно -1).
В TypeScript есть множество утилитных методов для работы с массивами, доступных через прототип массивов. Существует несколько методов, которые могут помочь в этой ситуации, но два самых удобных для данной цели:
Array.indexOf()
: принимает любое значение в качестве аргумента и возвращает первый индекс, по которому заданный элемент можно найти в массиве, или -1, если элемент отсутствует.Array.includes()
: принимает любое значение в качестве аргумента и определяет, включает ли массив это значение. Метод возвращаетtrue
, если значение найдено, в противном случае -false
.
Пример:
const channelArray: string[] = ['one', 'two', 'three'];
console.log(channelArray.indexOf('three')); // 2
console.log(channelArray.indexOf('three') > -1); // true
console.log(channelArray.indexOf('four') > -1); // false
console.log(channelArray.includes('three')); // true
В приведенном примере можно видеть, как используются оба метода для проверки наличия элемента в массиве. indexOf()
возвращает индекс найденного элемента или -1, если элемент отсутствует, в то время как includes()
возвращает логическое значение, указывающее на наличие элемента.
Вы можете также использовать метод filter
для этой задачи. Пример кода:
this.products = array_products.filter((x) => x.Name.includes("ABC"));
В данном примере мы фильтруем массив array_products
, чтобы получить только те элементы, у которых свойство Name
содержит подстроку "ABC".
Вот пример кода на TypeScript, который проверяет, содержится ли название отдела в массиве departments
. Если название уже присутствует, код завершает выполнение функции:
departments: string[] = [];
if (this.departments.indexOf(this.departmentName.trim()) > -1) {
return; // Если название отдела уже есть в массиве, выходим из функции
}
В данном коде используется метод indexOf
, который возвращает индекс первого вхождения указанного значения в массиве или -1, если значение не найдено. Сначала мы обрезаем пробелы в названии отдела с помощью trim()
, а затем проверяем, действительно ли оно уже присутствует в массиве departments
. Если это так, функция просто возвращает управление.
Сегодня я столкнулся с такой ситуацией. Если вам нужно использовать метод Array.includes()
, а ваша переменная или константа выглядит так:
const validNumbers: TValidNumber[] = ['one', 'two', 'three'];
Вы, скорее всего, столкнетесь с проблемой, что метод "includes" принимает в качестве параметра только тип "TValidNumber", а вы, возможно, передаете ему "string". Я не смог найти ответ за те 20 минут, что потратил на поиск, поэтому после нескольких попыток я обнаружил, что можно задать или присвоить тип для "validNumbers" как массив "TValidNumber" и массив "string" следующим образом:
const validNumbers: TValidNumber[] & string[] = ['one', 'two', 'three'];
С ненависти к TypeScript до любви к нему в одно мгновение, хехехе! Надеюсь, это поможет многим так же, как помогло мне.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?
Как проверить, пустой ли массив или он не существует?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'