Проверенный тип свойства существует, но все еще появляется ошибка?

1

Я получаю

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"));

Есть идеи?

Теги:
properties
undefined

3 ответа

1
Лучший ответ

Ваша петля отключена. Также выход еще не верен (выходы "ленивые"). Вам нужно сравнить с 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".

  • 0
    Спасибо, что исправили это! Я действительно ценю это, как мне пометить это как решенное?
0

Проблема в том, как вы индексируете. Выполнение 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"));
  • 0
    Большое спасибо. Это имеет смысл, я даже не подумал, что мне нужно сравнивать «текущий» longestWord
  • 0
    @ nuckingfut5 Не беспокойся. Рад, что смог помочь!
0
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,"");
}
  • 0
    Это имеет смысл, плюс 1 должен быть удален. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню