Софтуерно Инженерство
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
JS Core
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