nodejs получает значение в объекте, где ключи представляют собой список слов для сопоставления с предложением

#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 ключом — но это намного длиннее и уродливее. Регулярное выражение здесь действительно гораздо лучший подход.