Javascript: Лучший способ поиска регулярного выражения в ключах объекта

#javascript #javascript-objects

Вопрос:

Допустим, у меня есть следующий код, чтобы проверить, найдены ли слова в массиве в словаре, а затем выполнить какое-либо действие, если они есть:

 let dictionary = {
   aaa : 'value1',
   bbb : 'value2',
   ccc : 'value3'
}

let wordsArr = ['dfjd', 'aaa', 'Bbb', 'dfjkd']

for (let word of wordsArr) {
   if (word in dictionary) {
      console.log(word, 'is in dictionary')
   }
}
 

Но теперь я хочу, чтобы оператор if, который проверяет, есть ли слово в словаре, игнорировал регистр!

Очевидный способ, о котором я подумал, — это создать второй цикл, проходя через Object.keys(dictionary) него и выполняя .test() по каждой клавише.

 let dictionary = {
   aaa : 'value1',
   bbb : 'value2',
   ccc : 'value3'
}

let wordsArr = ['dfjd', 'aaa', 'Bbb', 'dfjkd']

for (let word of wordsArr) {
   let re = new RegExp(word, 'i');
   for (key of Object.keys(dictionary)){
      if (re.test(key)) {
      console.log(word, 'is in dictionary')
      }
   }
}
 

Но мне интересно, есть ли более быстрый способ сделать это, а не перебирать КАЖДЫЙ ключ в словаре для каждого слова в массиве. Например, с помощью in оператора или .hasOwnProperty() метода.

Комментарии:

1. Вы можете использовать карту для словаря вместо объекта developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Ответ №1:

Я хочу, чтобы оператор if, который проверяет, есть ли слово в словаре, игнорировал регистр!

И вы выбрали регулярное выражение для этого сопоставления без учета регистра, что вызывает у вас только вторую проблему (например, для правильного экранирования).

Нет, все, что вам нужно сделать, это преобразовать слово в нижний регистр и поискать его в своем словаре строчных ключей:

 const dictionary = {
   aaa : 'value1',
   bbb : 'value2',
   ccc : 'value3'
}

const wordsArr = ['dfjd', 'aaa', 'Bbb', 'dfjkd']

for (const word of wordsArr) {
   if (word.toLowerCase() in dictionary) {
//         ^^^^^^^^^^^^^^
      console.log(word, 'is in dictionary')
   }
} 

Комментарии:

1. Спасибо! Я никогда не думал о регулярных выражениях таким образом. Я буду иметь это в виду.

Ответ №2:

В этом случае вы можете сохранить свое O(1) (т. Е. быстрое) время поиска, если вы:

  • Храните все слова в словаре в нижнем регистре*
  • Преобразуйте слово, чтобы проверить .toLowerCase() * (например word.toLowerCase() in dictionary )

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

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

* Все это тоже будет работать с прописными буквами, просто строчные буквы более читабельны при распечатке