моя функция DIY Trim не может вернуть правильный ответ, он возвращает неопределенный - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать функцию с именем «trim» для удаления пробелов в заголовке и хвосте входной строки. (Я знаю, что String.prototype.trim может выполнять ту же работу, я просто практикую свой JS), но он возвращает "undefined", вы можете мне помочь?

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        trim(str);
    } else {
        return str;
    }
}

console.log(trim('  ab c '));

Ответы [ 2 ]

4 голосов
/ 12 апреля 2019

Вам нужно return из каждого места, где вы рекурсивно работаете, чтобы убедиться, что у вас есть все возвраты обратно в стек до исходного вызывающего.Смотрите фрагмент ниже.

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        return trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        return trim(str);
    } else {
        return str;
    }
}

console.log(trim('  ab c '));

Еще немного контекста:

Каждый раз, когда вы вызываете trim изнутри тела функции trim, вы возвращаетесь .Если взять строку ' hello ' и вызвать trim как (trim(' hello ')), происходит следующее:

  1. Вызов trim(' hello ').
  2. Первое if условиеmet-- строка нарезается и вызывается trim('hello ').
  3. Второе if условие выполнено - вызывается строка trim('hello').
  4. Нет if условие выполняется- else блок введен `'привет' возвращается.

Таким образом, наш стек вызовов равен trim(' hello ') ==> trim('hello ') ==> trim('hello').Однако в той функции, в которой вы ее изначально написали, только последний вызов trim (trim('hello')) фактически возвращает значение предыдущему вызывающему - остальные вызовы trim ничего не возвращают (undefined).Чтобы убедиться, что возвращаемое значение передается полностью до первоначального вызывающего объекта trim(' hello '), вам необходимо убедиться, что каждый раз, когда вы повторяете return, результат рекурсии.

0 голосов
/ 12 апреля 2019

Вы возвращаете str только по предложению else.Вы должны вернуться в каждом случае:

function trim(str) {
    if (str.charAt(0) === ' ') {
        str = str.slice(1);
        trim(str);
    } else if (str.charAt(str.length - 1) === ' ') {
        str = str.slice(0, -1);
        trim(str);
    }
    return str;
}
...