#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
)
Таким образом, информация о регистре будет потеряна, и вы получите ту же строку, которую можно использовать в качестве ключа словаря.
Однако, если вы действительно хотите сопоставить ключи с регулярным выражением, вам придется повторить все ключи.
* Все это тоже будет работать с прописными буквами, просто строчные буквы более читабельны при распечатке