Я получаю
TypeError: Невозможно прочитать свойство 'length' неопределенного
по приведенному ниже коду. В частности, ошибка newStr[i].length
командой newStr[i].length
. Как вы можете видеть (прокомментированный), я тестировал и могу подтвердить, что существует newStr[1]
:
function findLongestWord(str) {
var expression = /\w+/g;
var newStr = str.match(expression);
// return newStr[1].length;
var longestWord = "";
for (var i = 1; i < (newStr.length + 1); i++) {
if (newStr[i].length > newStr[i - 1].length) {
longestWord = newStr[i];
} else {
longestWord = longestWord;
}
}
return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
Есть идеи?
Ваша петля отключена. Также выход еще не верен (выходы "ленивые"). Вам нужно сравнить с longestWord
вместо предыдущего слова.
function findLongestWord(str) {
var expression = /\w+/g;
var newStr = str.match(expression);
// return newStr[1].length;
var longestWord = "";
for (var i = 1; i < newStr.length; i++) { // fixed off-by-one
if (newStr[i].length > longestWord.length) { // compare to longestWord
longestWord = newStr[i];
} else {
longestWord = longestWord;
}
}
return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
Дает "jumped"
.
Проблема в том, как вы индексируете. Выполнение i < newStr.length + 1
совпадает с i <= newStr.length
. Поскольку все индексируется 0, вы пытаетесь получить доступ к чему-то в newStr[newStr.length]
но последний возможный элемент находится в newStr[newStr.length - 1]
.
Здесь ваш код с правильной индексацией:
function findLongestWord(str) {
var expression = /\w+/g;
var newStr = str.match(expression);
var longestWord = "";
for (var i = 0; i < newStr.length; i++) {
if (newStr[i].length > newStr[i - 1].length) {
longestWord = newStr[i];
} else {
longestWord = longestWord;
}
}
return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
Однако ваша логика также ошибочна. Если вы хотите найти самое длинное слово, вы не хотите сравнивать каждое слово с предыдущим. Вы хотите сравнить самое длинное слово, которое вы нашли до сих пор, против каждого найденного вами слова.
function findLongestWord(str) {
var expression = /\w+/g;
var newStr = str.match(expression);
var longestWord = "";
for (var i = 0; i < newStr.length; i++) {
/***********************************/
if (newStr[i].length > longestWord.length) {
longestWord = newStr[i];
}
/***********************************/
}
return longestWord;
}
console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
for (var i = 1; i < (newStr.length + 1); i++) {
newStr.length будет, например, 4, тогда я буду работать до 4, но newStr [4] не существует. Так оно также имеет длину.
Вы можете сделать все немного короче:
function findLongestWord(str) {
return str.split(" ").reduce((longest,curr)=>curr.length>longest.length?curr:longest,"");
}