Не удается прочитать свойство 'длина' неопределенного сообщения об ошибке в Javascript - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь решить проблему с кодом в войнах с кодом и не понимаю, почему я получаю сообщение об ошибке относительно .length строки внутри массива, когда пытаюсь его запустить.

Это определенно первый .length в строке 7. Я пробовал запустить другие arr[i].lengths, и они работают, я думаю, это проблема с областью действия?

function longestConsec(strarr, k) {
  var arr = [];
  if (strarr.length == 0 || k > strarr.length || k <= 0) {
    return "";
  }
  for (var i = 1; i <= strarr.length; i++) {
    if (strarr[i].length > strarr[0].length && arr.length < k) {
      arr.push(strarr[i]);
    }
  }
  arr.join('');
}

longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2);

Должен возвращать "abigailtheta", поскольку это 2 самые длинные строки после первой строки, которые были требованиями.

VM304: 7 Uncaught TypeError: Невозможно прочитать свойство 'length' из неопределенного

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Элементы в массиве идут от 0 до length - 1.

У вас есть 6 строк в массиве, последняя из которых имеет индекс 5.

Поскольку набор условий, который следует выполнять, пока индекс меньше или равен strarr.length, он пытается выполнить итерацию шестого элемента, которого не существует.

Вы должны изменить условие для итерации:

for (var i = 1; i < strarr.length; i++) {

function longestConsec(strarr, k) {
  var arr = [];
  if (strarr.length == 0 || k > strarr.length || k <= 0) {
    return "";
  }
  for (var i = 1; i < strarr.length; i++) {
    if (strarr[i].length > strarr[0].length && arr.length < k) {
      arr.push(strarr[i]);
    }
  }
  arr.join('');
  alert(arr);
}

longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2);
0 голосов
/ 01 июня 2019

Как уже указывалось, вы итерируете один раз слишком многоВаша последняя итерация будет пытаться получить доступ к индексу, который не существует в вашем массиве.

Кроме этого, ваш код, похоже, не работает так, как вы описали.Он не обращается к «самой длинной» в любой точке, а просто захватывает первые две строки, которые длиннее первой.

Если вы хотите найти последовательные строки, которые объединяются для самой длинной длины, подумайте о чем-нибудькак это вместо этого:

function longestConsec(strarr, k) {
  //invalid - exit
  if (strarr.length === 0 || k > strarr.length || k <= 0) return "";
  
  return strarr.reduce((out, str, idx, arr) => {
    if (idx+k > arr.length) arr.splice(1);          //exit early if at end of array
    
    let substring = arr.slice(idx,idx+k).join("");  //combine next k items into a string
    if (substring.length > out.length) {            //if it's the longest
      out.length = substring.length;                //save the length
      out.str = substring;                          //save the string
    }
    
    return out;
  }, {length: 0, str: ""});
}

var longest = longestConsec(["one", "seventeen", "four", "nineteen", "eleven", "five", "sixteen", "thirteen", "fourteen", "six"], 3);
console.log(longest);
.as-console-wrapper {max-height: none !important; top: 0;}

Здесь есть возможности для повышения эффективности, поскольку каждый раз вызывать .slice() не обязательно, но в любом случае я считаю, что результат немного большев соответствии с вашей задачей.

0 голосов
/ 01 июня 2019

Вы перебираете массив с неправильными границами.

Вы должны изменить его на strarr.length - 1.

Или удалить меньше или равно и использовать только меньше чемоператор

Поскольку индекс последнего доступного элемента в массиве равен длине массива минус 1

...