#node.js #string
#node.js #строка
Вопрос:
итак, у меня есть объект, где ключи представляют собой список слов, а значения — функции, которые выглядят следующим образом :
{
'test,qwe,asdwe': [Function: test1],
'lol,xd': [Function: test2]
}
У меня есть предложение, и я хочу сопоставить его с ключом, где ЛЮБОЕ слово в предложении соответствует любому слову в ключах (ключ не может иметь 2 раза одно и то же слово)
Пример с объектом вверху :
Совпадение предложения "hi , how are you lol"
со второй функцией test2
Я могу сопоставить ключи с
Object.keys(myObject).some(key => key === 'lol')
но это не работает, если в предложении есть ‘lol hhh’, оно должно совпадать только с ‘lol’ в предложении, я думаю, я могу сделать это с помощью strstr, может быть? но я не знаю, как лучше всего.
если кто-то может мне помочь, пожалуйста =)
Спасибо
Комментарии:
1. Что вы хотите сделать с совпадением, если оно будет найдено, можете ли вы привести пример того, что произойдет?
2. если оно совпадает, я хочу, чтобы функция затем выполнила его.
Ответ №1:
Сначала я бы преобразовал объект в другой, ключи которого представляют собой отдельные слова (например, разделить 'lol,xd'
на две отдельные пары ключ-значение). Затем вы можете создать регулярное выражение, чередуя все ключи объекта, затем сопоставить строку с регулярным выражением и вызвать соответствующую функцию:
const initialObj = {
'test,qwe,asdwe': () => console.log('test1'),
'lol,xd': () => console.log('test2'),
};
const separatedObj = Object.fromEntries(
Object.entries(initialObj).flatMap(
([key, fn]) => key.split(',').map(word => [word, fn])
)
);
const regex = new RegExp(Object.keys(separatedObj).join('|'), 'g');
for (const word of "hi , how are you lol".match(regex)) {
separatedObj[word]();
}
Комментарии:
1. Есть ли способ сделать его короче? или не с регулярным выражением? регулярное выражение не слишком тяжелое только для этого? Спасибо за ваш ответ
2. Сопоставление строк с различными возможными шаблонами — это именно то, в чем преуспевают регулярные выражения, часто намного превосходящие другие более программные решения. Я думаю, если бы вы действительно хотели, вы могли бы перебрать каждый индекс строки, нарезать его, затем перебрать каждый возможный ключ и проверить, является ли нарезанная строка
startsWith
ключом — но это намного длиннее и уродливее. Регулярное выражение здесь действительно гораздо лучший подход.