Splice по другому ведет себя внутри foreach

Рейтинг: 0Ответов: 1Опубликовано: 05.02.2023

Код

function editText(text) {
    let str = Array.from(text);
    let i = 0;
    str.forEach((el) => {
        console.log(i);

        str.splice(i, 1);
        i++;
    })

    return str.join('');
}

console.log(editText('@@@@@'));

вывод => введите сюда описание изображения

То-есть цикл доходить до 3-го элемента а дальше не срабатывает, почему так?

Написал вот такой код

function editText(text) {
    let str = Array.from(text);
    let chars = ['@', ' ', '#', '.'];
    let counter = 0;
    for (let i = 0; i < str.length; i++) {
        let nextEl = str[i + 1];
        for (let j = 0; j < chars.length; j++) {
            if (str[i] == chars[j]) {
                if (str[i] == nextEl) {
                    delete str[i];
                }
            }
        }
    }
    console.log(str);
    return str.join('');
}
console.log(editText('dgalymbek@@inbox..ru ##mail ##gmail'));   

Вывод => dgalymbek@inbox.ru #mail #gmail

Ответы

▲ 0

Для того чтобы заменить задублированные символы, вы можете использовать следующее регулярное выражение (?<char>[@#. ])\k<char>, где в именованной группе перечислите символы, которые ищите. Группирующая конструкция (?<char>) содержит символ, чтобы заставить механизм регулярных выражений запомнить соответствие подвыражения (которое в данном случае будет любым отдельным символом) и сохранить его под именем char. Построение обратной ссылки \k<char> заставляет regexp сравнивать текущий символ с ранее составленным символом, хранящимся в разделе "char". Все регулярное выражение успешно находит совпадение везде, где один символ совпадает с предыдущим символом.

Ниже приведен код на python, который заменит задублированные символы на одиночные. В строку я добавил контр примеров, чтобы проиллюстрировать, что пары стоящих рядом символов из искомой выборки не будут превращены в одиночный символ.

Пример на Python

import re

regex = r"(?<char>[@#. ])\k<char>"

test_str = "dgalymbek@@inbox..ru ##mail ##gmail .@  #."

subst = "$1"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

Вот пример на JS.

const regex = /(?<char>[@#. ])\k<char>/gm;

// Alternative syntax using RegExp constructor
// const regex = new RegExp('(?<char>[@#. ])\\k<char>', 'gm')

const str = `dgalymbek@@inbox..ru ##mail ##gmail .@  #.`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);