@hckn

Как изменить строку несколько раз в цикле?

let string = 'This is cool!'
const words = ['cool', 'this']
words.map(word => {
    string = this.string.replace(word, `<a href="#">${word}</a>`)
})


В итоге я получу строку всего с одним линком (со словом this, последнее в массиве words).
Как изменить оба совпадения в строке?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
for (const n of words) {
  string = string.replace(RegExp(`\\b${n}\\b`, 'gi'), m => `<a href="#">${m}</a>`);
}

или

const newString = words.reduce((acc, n) => {
  return acc.replace(RegExp(`\\b${n}\\b`, 'gi'), '<a href="#">$&</a>');
}, string);
Ответ написан
Лучше использовать forEach, так как map возвращает трансформированный массив, а вы ведь его никуда не записываете.

words.forEach(word => string = string.toLowerCase().replace(word, `<a href="#">${word}</a>`));

console.log(string);  // <a href="#">this</a> is <a href="#">cool</a>!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@forspamonly2
с тем, что у вас не работало из-за регистра, вам уже 0xD34F подсказал.

а если отвечать буквально на вопрос в заголовке, то тут надо делать reduce.

const words = ['cool', 'this'].map(word => new RegExp(`(${word})`, 'i')); 

words.reduce((string, word) => string.replace(word, '<a href="#">$1</a>'), 'This is cool!');
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы