2

Данная проблема: https://www.codewars.com/kata/shortest-word/train/javascriptПочему возврат длины локальной переменной в функцию сокращения вызывает ошибку?

Найти кратчайшую длину слова в строке.

Это работает:

function findShort(s){ 
    return s.split(' ').reduce((a, b) => b.length < a.length ? b : a).length; 
} 

Но это не делает:

function findShort(s){ 
    return s.split(' ').reduce((a, b) => b.length < a.length ? b.length : a.length); 
} 

Любая идея, почему я не могу вернуть длину или б, даже если они должны быть строками? Я явно не хватаю что-то здесь ...

Благодаря

+0

Вам не нужно писать свою собственную логику, чтобы найти минимальный список - 'Math.min' уже делает это. Попробуйте 'Math.min (... s.split ('') .map (({length}) => length)'. –

ответ

2

Возвращаемое значение из .reduce() обратного вызова значения, передаваемые последовательно для каждого вызова функции обратного вызова. Если первая итерация обратного вызова возвращает только значение .length, то номер будет передан на вторую итерацию. Когда это произойдет, ваш код попытается найти свойство .length на номере, которого не будет, и вы в конечном итоге жонглируете значением undefined.

Итак, в первой (рабочей) версии кода обратный вызов сначала вызывается с a, являющимся первым словом разделенной строки, а b - вторым. Он возвращает либо a, либо b. Затем обратный вызов снова вызывается с результатом этого первого вызова как a, а третье слово - b. Процесс повторяется до тех пор, пока последнее слово не будет передано как b, и окончательная строка будет возвращена. Затем, после завершения .reduce(), код захватывает .length этой кратчайшей строки.

Во второй (нерабочей) версии первый вызов такой же, как в рабочей версии, с первым словом a, а второй - b. Обратный вызов возвращает длину более короткого слова. Таким образом, при втором вызове обратного вызова a представляет собой число (ранее возвращенную более короткую длину) и b является третьим словом. Доступ к a.length будет undefined, поэтому сравнение будет false, и функция вернет a.length, что составляет undefined. При третьем вызове обратного вызова a будет поэтому undefined, и попытка получить доступ к a.length вызовет исключение.

+0

Спасибо, теперь это имеет смысл! Я был слишком сфокусирован на .length Я забыл, как в первую очередь, сокращают работы. – Nymik

0

Альтернативным решением является преобразование массива строк первого в массив чисел, так что операция может уменьшить только работать на номера:

s.split(' ').map(x => x.length).reduce((a, b) => b < a ? b : a); 
+0

Хороший план, Бэтмен! – Nymik

Смежные вопросы