Цикл в обратном направлении по массиву javascript с помощью array.length с использованием цикла for - PullRequest
0 голосов
/ 04 апреля 2019

Если у меня есть массив = [8,7,6,5,4], который я хочу перебрать, почему следующий цикл for все еще работает, но длина массива равна 5, а в индексе 5 массива нет элемента?

for(let i=array.length;i>=0;i++){
  //do something 
}

Я знаю, что было бы точнее вычесть 1 из длины, но почему код выше все еще работает

Ответы [ 5 ]

1 голос
/ 04 апреля 2019

Почти. Вы должны:

  • Уменьшите i вместо увеличения и
  • Начните с array.length-1, потому что индексы массива начинаются с 0, а не с 1.

Так что используйте вместо:

for (let i = array.length-1; i >=0 ; i--) {
0 голосов
/ 04 апреля 2019

Длина массива равна количеству записей, если они все были заполнены.Разреженные массивы не имеют длины числа элементов в них, но основаны на максимальном индексе в них

Например:

let a = [];
a[10] = 1;
console.log(a.length);
console.log(a);

Длина составляет 11 (от 0 до 10), и вы можете видеть, что есть значения undefined для индекса от 0 до 9.

Четная настройкапоследнее значение undefined не влияет на длину, поскольку в этой позиции все еще есть значение undefined.

let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);

a[10] = undefined
console.log(a.length);

Использование удаления по-прежнему не влияет на длину.

let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);

delete a[10];
console.log(a.length);

Единственный способ изменить длину - создать новый массив как подмножество оригинала:

let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);
console.log(a);

a = a.slice(0,9);
console.log(a.length);
console.log(a);
0 голосов
/ 04 апреля 2019
for(let i=array.length-1;i>=0;i--){
  //do something 
}

вам нужно установить i на длину массива -1 (потому что индекс массива начинается с 0). Затем каждый раз, когда вы проходите цикл, вам нужно вычесть один из i (i--)

ваш код работает, но будет проходить через цикл огромное количество раз, пока число не превратится в отрицательное. Попробуйте добавить console.log (i) в ваш цикл, чтобы понять, что я имею в виду. (он, скорее всего, замерзнет, ​​если вы сделаете это в инспекторе)

0 голосов
/ 04 апреля 2019

Потому что это так:

const array = [1,2,3,4];
for(let i=10;i>=0;i--){
  console.log(array[i]);
}

Вы можете за цикл, что хотите. В javascript все является объектом, включая массив. Доступ к чему-то, что не существует в объекте с [], возвращает неопределенное значение.

0 голосов
/ 04 апреля 2019

Это происходит потому, что массивы в Javascirpt не ограничены размером, который они были объявлены. Таким образом, это означает, что если вы попытаетесь получить доступ к пустой позиции, вы получите неопределенное. Например, в этом случае, если вы сделаете array[5], вы получите undefined, а не ArrayIndexOutOfBoundsException, как это было бы в Java.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...