Для цикла итерации <vs <= основы JavaScript

1

Мне трудно понять, почему этот блок кода дает мне

TypeError: Невозможно прочитать свойство "0" неопределенного

function fromListToObject(array) {
  // make new empty object to store key:value in
  var obj = {};
  // loop over the given array
  for (var i = 0; i <= arr.length; i++){
    //every iteration keys gets stored with new key
    var keys = arr[i][0];
    // same here
    var values = arr[i][1];
    //pushing new key:value into obj
    obj[keys] = values;
  }
  return obj;
}
var arr= [['1', 'One'], ['2', 'Two'], ['3', 'Three'], ['4', 'Four'], ['5', '5']];
var result = fromListToObject(arr);

console.log(result);

То, что я пробовал: Когда я запускаю цикл for внутри функции fromListToObject() только с i < arr.length это работает. Я пробовал искать ответы, но я мог бы спросить не так. Не должен ли цикл работать с оператором "="?

  • 0
    это внизу @ 4castle
  • 1
    Массивы начинаются с 0, поэтому array.length - это 1 после последнего элемента. < - правильное сравнение.
Показать ещё 1 комментарий
Теги:

1 ответ

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

Если у вас есть массив из 10 элементов, и вы начинаете считать с 1 - последний элемент будет помещен на 10th е место.

Однако, если вы начинаете свой счет с 0 (как работает массив), последняя позиция будет length - 1 (в этом примере - 9).

В вашем примере - цикл for начинается с 0 и должен отсчитываться до последнего элемента в вашем массиве, который помещается в позицию length - 1.
Это место также <length (потому что когда мы добираемся до =length - это "вне массива" - вы пытаетесь получить доступ к элементу в месте, которое не существует):

for (var i = 0; i < arr.length; i++) {
    ...
}

Обратите внимание, что точно так же вы можете сделать:

for (var i = 1; i <= arr.length; i++) {
    // Note that here you would want to access the elements
    // in the array using arr[i-1]
    ...
}

Но это реже.

Другой вариант, который у вас есть, - использовать метод forEach массива:

arr.forEach(function(element) {
    ...
});
  • 0
    Ваш первый альтернативный пример ( for (var i = 1; i <= arr.length; i++) { ) не верен ..... Я думаю, что вы думаете о (var i = 0; i <= arr.length-1; i++)
  • 0
    @ Claies Это делает. Я ничего не писал об использовании i внутри этого цикла. Если вы используете arr[i-1] он работает отлично ...
Показать ещё 2 комментария

Ещё вопросы

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