Здравствуйте, есть такая задача менять текстовый контент сайта, например все слова автомобиль заменить на слово самокат. Сейчас написал рекурсивное решение, примерно так:
function recursiveReplace(node, original, replace) {
const regex = new RegExp(`${original}`, 'i') //регулярное выражение с флагом i для игнорирования регистра
if(node.innerText.search(regex) > -1) { //если в текстовом контенте блока найдено такое слово
const childs = node.childs() //хоткей для получения потомков, аналог node.children, уже обернутый в Array.from()
if(childs.length == 0) { //если детей у блока нет, значит слово находится внутри него, просто меняем на замену
node.innerText = node.innerText.replace(regex, replace)
} else { //если у блока есть дети, то слово может быть как в одном из них, так и в текстовой ноде блока
const completed = childs.map(c => recursiveReplace(c, original, replace)) //к каждому ребенку применяем рекурсивную замену
if( completed.every(i => !i) ) { //если в каждом ребенке такого слова не нашлось, значит слово в текстовой ноде самого блока
node.innerHTML = node.innerHTML.replace(regex, replace)
}
}
return true
} else {
return false
}
}
Работает решение так себе, иногда проскакивают не заменённые слова, скорее всего я что-то не учел. Поэтому, возможно кто-нибудь знает решения лучше моего? Реквестую любые способы улучшения текущего алго, заранее спасибо!