Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Lyubomir_Georgiev avatar Lyubomir_Georgiev 1 Точки

JS ParseTags Recursive solution

Здравейте Колеги,

Искам да реша, но без успех, задачата за намиране и изтриване на тагове в стринг с рекурсия. В случая таговете са <orgcase> и </orgcase>, но това няма значение. Ето кода:

const input = `We are <orgcase>liViNg</orgcase> in a <upcase>yellow submarine</upcase>.

We <orgcase>doN\'t</orgcase> have <lowcase>anything</lowcase> else`;

let output = '';

String.prototype.removeOrgCase = function() {

       const inQuote = '<orgcase>',

                 outQuote = '</orgcase>';

       let indexIn = 0,

             indexOut = 0;

       indexIn = this.indexOf(inQuote);

       indexOut = this.indexOf(outQuote, indexIn);

       if (indexIn > 0) {

             (this.substring(0, indexIn) + this.substring(indexIn + inQuote.length, indexOut) +

                this.substring(indexOut + outQuote.length)).removeOrgCase();

        }

//recursion bottom

        else if (indexIn === -1) {

        return output + this;

         }

}

input.removeOrgCase();

console.log(output);

Аз доста се помъчих, но до тук ми стигнаха знанията.

Тагове:
0
Module: JS Advanced
Nikola_Andreev avatar Nikola_Andreev 671 Точки
Best Answer

По принцип твоето решение си работи, просто не извеждаш правилно крайният резултат. С return няма да стане понеже използваш рекурсия и резултата от извикването на input.removeOrgCase() е undefined. Това е защото не връщаш резултат по време на първото извикване а викаш отново функцията (правиш рекурсия). А когато не върнеш нищо от функция, резултата е undefined.  Ето малко променено и съкратено твоето решение.

let input = `We are <orgcase>liViNg</orgcase> in a <upcase>yellow submarine</upcase>.
We <orgcase>doN\'t</orgcase> have <lowcase>anything</lowcase> else`;
String.prototype.removeOrgCase = function() {
    const inQuote = '<orgcase>',
        outQuote = '</orgcase>';
    let indexIn = this.indexOf(inQuote);
    let indexOut = this.indexOf(outQuote, indexIn);
    if (indexIn > 0) {
        (this.substring(0, indexIn) + this.substring(indexIn + inQuote.length, indexOut) +
            this.substring(indexOut + outQuote.length)).removeOrgCase();
    } else if (indexIn === -1) {
        input = this.toString();
    }
}
input.removeOrgCase()
console.log(input);

Все пак е важно да споменем че решаването на този проблем не се нуждае от рекурсия. Ето и едно по кратко решение.

String.prototype.replaceAll = function(search, replacement) {
    let target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

input = input.replaceAll('<orgcase>', '')
input = input.replaceAll('</orgcase>', '')
console.log(input)

 

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.