JavaScript | Поиск слов в массиве без учёта регистра

Задача

Нужно проверить, существует ли слово в массиве к каком-либо варианте написания — символы строки могут быть в разных регистрах (строчные или заглавные).

 

Решение

Задачу проще всего решить путём приведения обеих строк к одному регистру. Обеих — это каких?

  • строку, которую ввёл пользователь
  • строку, которая есть в массиве данных

Сравниваются два варианта с одним приведением.

Пример

Предположим пользователь ввёл в строку поиска слово «мАШина«. Предположим у нас есть массив, по которому осуществляется поиск:

var massiv = ["Авто","Машина","Мото","Двигатель","Трансмиссия"]

В таком виде мы никак не найдём искомый элемент. Результат проверки наличия слова в массиве даст ложь — false

massiv.includes("мАШина")
false
Слово не найдено в массиве - JavaScript
Слово не найдено в массиве — JavaScript

Что это значит? Посимвольный разбор строки не дал 100% совпадения. Тупо не совпали последовательности символьных кодов.

"мАШина" - это [1084, 1040, 1064, 1080, 1085, 1072]

"Машина" - это [1052, 1072, 1096, 1080, 1085, 1072]
Разные последовательности символьных кодов строк - JavaScript
Разные последовательности символьных кодов строк — JavaScript

 

Как быть?

В JavaScript для всех экземпляров класса String можно использовать метод toLowerCase(). Для нас это приведение символа к нижнему регистру.

Условие поиска будет выглядеть так:

massiv.filter(i => i.toLowerCase() == "мАШина".toLowerCase())

Мы искомое слово приводим к нижнему регистру и сравниваем с элементами массива тоже в нижнем регистре. Фильтр отловит нужные нам совпадения, если они будут.

Фильтр нашёл элемент в массиве - JavaScript
Фильтр нашёл элемент в массиве — JavaScript

Прелесть этого подхода в том, что фактически мы получаем НАЙДЕННОЕ ЗНАЧЕНИЕ как в массиве, а не как ввёл пользователь или как строка была преобразована.

Если совпадений не будет, тогда длина возвращённого массива будет равна нулю.

Фильтр не нашёл элемент в массиве - JavaScript
Фильтр не нашёл элемент в массиве — JavaScript

Всё это выражение можно обернуть функцией или можно написать свой метод

 

Собственный метод для экземпляров Array

Array.prototype.includesCase = function(str){
   return this.filter(i => i.toLowerCase() == str.toLowerCase())
}

Проверяем работу метода:

massiv.includesCase("трансМиссиЯ")

Скриншот из браузера:

Собственный метод для экземпляров Array - JavaScript
Собственный метод для экземпляров Array — JavaScript

 

Информационные ссылки

JavaScript | Строки (String)

Стандарт ECMAScript — Раздел «22.1.3.26 String.prototype.toLowerCase ( )» — https://tc39.es/ecma262/#sec-string.prototype.tolowercase

Поделись записью