Array.length не дает ожидаемого результата в цикле for

Итак, я задавал вопрос, связанный с реверсированием массива. Он принимает массив в качестве аргумента и создает новый массив, который имеет те же элементы в обратном порядке. Это то, что я придумал сначала.

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var array = [];

for(var i = 0; i < fruits.length; i++){
 array.push(fruits.pop(i))
}
console.log(array);

В итоге я получил ["Mango", "Apple"], чего я не ожидал. Поэтому я попробовал это вместо этого:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var array = [];
var count = fruits.length;

for(var i = 0; i < count; i++){
 array.push(fruits.pop(i))
}
console.log(array);

Эта версия дала мне то, что я хотел ["Mango", "Apple", "Orange", "Banana"]. Таким образом, единственная разница между ними заключается в том, что в первом я использую fruits.length непосредственно в цикле for, а во втором я назначаю значение fruits.length для count, которое затем использую в цикле for. Я не понимаю, почему они дают два разных результата. Разве это не одно и то же? Может кто-нибудь помочь понять, что здесь происходит?

Это не одно и то же. Каждый раз, когда он проверяет состояние массива, как только вы извлекаете элемент из массива, он удаляется, а fruits.length обновляется.

chintuyadavsara 31.10.2018 13:57

Fruit.length оценивается в каждом цикле, а pop удаляет элементы из массива.

Phiter 31.10.2018 13:58

@ChintuYadavSara Понятно. Большое спасибо.

Emmanuel 31.10.2018 14:12

@Phiter Понял. Цените помощь

Emmanuel 31.10.2018 14:13

@Elijah, проверьте мой ответ, и, если он вам пригодится, отметьте его как правильный: D

Phiter 31.10.2018 14:14

@Phiter сделает это.

Emmanuel 31.10.2018 14:19
1
6
52
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы удаляете фрукт из своего массива, то есть fruits.pop(i), что уменьшает fruits.length. Что затем оценивается каждый раз в цикле.

Совершенно очевидно, что ваш второй пример работает правильно. Здесь вы устанавливаете длину один раз и только один раз.

Использование fruits.pop() удаляет последний элемент из массива, поэтому при первом проходе i = 0 и fruits.length = 4, следующем проходе i = 1 и fruits.length = 3, следующем проходе i = 2 и fruits.length также = 2, поэтому ваша проверка i < fruits.length больше не проходит, и цикл заканчивается.

Во втором примере вы предварительно определяете длину равной 4, и это не меняется по мере удаления элементов из массива, поэтому цикл продолжается, пока i <4.

Ответ принят как подходящий

По сути, array.length будет оцениваться в каждом цикле, и вы каждый раз меняете размер массива на -1. Поскольку вы присваиваете счет переменной перед входом в цикл, переменная не изменится.

Давайте разберемся:

В вашем массиве 4 элемента, ваш счетчик - 0. Вы выполняете итерацию один раз, удаляете один элемент из массива, и счетчик увеличивается на 1. Теперь array.length равен 3.

То же самое, теперь счетчик равен 2, а array.length равен 2.

При попытке запустить в третий раз условие не будет совпадать, и код не запустится. Вот почему в массиве всего два элемента.

Хм, вы используете метод pop(), который удаляет доступный элемент из массива после того, как он был прочитан.

Вначале у вас есть 4 элемента.

Таким образом, цикл начинает доступ к последнему элементу и удаляет его из fruits, а затем добавляет его в новый массив. На следующем этапе длина цикла будет равна 3, а не 4.
. тогда длина равна 2, и это место, где цикл не удовлетворяет условию continue.

Если вы сохраните число счетчика в переменной, оно не будет затронуто в последнем счетчике массива.

Во-первых, Array.pop не подтверждает никаких параметров. Следовательно, fruits.pop(i) и fruits.pop() - одно и то же.

Понимание 1-го цикла

for(var i = 0; i < fruits.length; i++){
 array.push(fruits.pop(i))
}

Для я = 0, fruits = ["Banana", "Orange", "Apple", "Mango"], fruits.length = 4 -> я <плод. длина - это ПРАВДА, входит в цикл и выдает 1 значение

Для я = 1, fruits = ["Banana", "Orange", "Apple"], fruits.length = 3 -> я <плод. длина равно ПРАВДА, входит в цикл и выдает 1 значение

Для я = 2, fruits = ["Banana", "Orange"], fruits.length = 2 -> я <плод. длина равно ЛОЖНЫЙ, разрывает цикл


Понимание 2-го цикла

for(var i = 0; i < count; i++){
 array.push(fruits.pop(i))
}

Для я = 0, fruits = ["Banana", "Orange", "Apple", "Mango"], count = 4 -> я <count - это ПРАВДА, входит в цикл и выдает 1 значение

Для я = 1, fruits = ["Banana", "Orange", "Apple"], count = 4 -> я <count - это ПРАВДА, входит в цикл и выдает 1 значение

Для я = 2, fruits = ["Banana", "Orange"], count = 4 -> я <count - это ПРАВДА, входит в цикл и выдает 1 значение

Для я = 3, fruits = ["Banana"], count = 4 -> я <count - это ПРАВДА, входит в цикл и выдает 1 значение

Для я = 4, fruits = [], count = 4 -> я <count равно ЛОЖНЫЙ, разрывает цикл

Другие вопросы по теме