Как перевернуть содержимое массива в другой массив с помощью forEach-Loop? - PullRequest
0 голосов
/ 01 июня 2018

Я хотел бы знать, что не так с моим кодом.Как и в описанном заголовке, я бы хотел перевернуть содержимое массива с помощью цикла for в другой массив.Я хотел бы использовать ES5 для этого, так как я еще не привык к ES6 +.

Вот мой код:

    var arrayA = ["h","e","l","l","o"];
    var arrayB = [];
     function copyArray(oldArray, newArray) {
       oldArray.forEach(function() {
            var storeElement = oldArray.pop();
           newArray.push(storeElement); 
     });
       console.log(oldArray + " old array");
       console.log(newArray + " new array");
    }
    
    
    copyArray(arrayA, arrayB);

Результат:

"h,e,l,l old array"
"o new array"
"h,e,l old array"
"o,l new array"
"h,e old array"
"o,l,l new array"
"h,e FINAL old array"
"o,l,l FINAL new array"

Но это должно быть:

"" FINAL old array
"o, l, l, e, h" FINAL new array. 

Что не так?

Спасибо заранее

Ответы [ 5 ]

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

Как указано, вы можете использовать реверс.Но чтобы ответить на ваш вопрос о том, почему это не работает: вы изменяете массив так, что цикл forEach завершается раньше.

Таким образом, одним из решений будет:

  1. Донне изменяйте массив, который вы просматриваете
  2. Получите последний элемент из oldArray и добавьте его в newArray
  3. Затем второй последний элемент из oldArra и добавьте его в newArray

и т. Д.

Мы знаем, что мы можем получить последний элемент из массива с помощью

var lastItem = myArray[myArray.length-1]

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

var secondLastItem = myArray[myArray.length-2]

Мы все еще можем использовать метод forEach, так как обратный вызов имеет несколько параметров, таких как текущий элемент и текущий индекс.

Поэтому, когда вы просматриваете массив, первый индекс равен 0, в следующий раз, когдаиндекс становится равным 1 и т. д.

Теперь у нас есть что-то, что увеличивается при продолжении цикла, и мы можем вычесть 1, затем вычесть 2, затем вычесть 3 и т. д.

Таким образом, наше решение может выглядеть следующим образомэто;

var arrayA = ["h","e","l","l","o"];
var arrayB = [];
function copyArray(oldArray, newArray) {         
    oldArray.forEach(function(item,index) {                         
        newArray.push(oldArray[oldArray.length-1-index]); 
    });
    console.log(oldArray + " old array");
    console.log(newArray + " new array");
}

copyArray(arrayA, arrayB);
0 голосов
/ 01 июня 2018

То, с чем вы столкнулись здесь, - это циклический просмотр массива при редактировании его содержимого.

Для каждого элемента в старом массиве вы извлекаете элемент и помещаете его в другой элемент.Подумайте, что происходит, когда цикл forEach находится в n-м элементе массива, а n + 1-й элемент выталкивается?Теперь он зацикливается на массиве, который на один элемент короче, чем раньше?Какой элемент станет следующим в цикле forEach?

Если вы хотите удалить все элементы первого массива, используйте while

while(oldArray.length !== 0){
    newArrary.push(oldArray.pop());
}

Если вы хотите сохранить исходный цикл массива для каждого элемента и добавить его в новыймассив

oldArray.forEach(function(oldArrayElement) {
    newArray.push(oldArrayElement);
});
0 голосов
/ 01 июня 2018

Когда вы делаете pop, над новой копией вашего массива, вы не изменяете oldArray.

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

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

Для этого вы можете сделать таким образом

var arrayA = ["h","e","l","l","o"];
var arrayB = [];
function copyArray(oldArray, newArray) {
  newArray = oldArray.reverse().slice();
  oldArray.length = 0;
  console.log(oldArray + " old array");
  console.log(newArray + " new array");
}


copyArray(arrayA, arrayB);
0 голосов
/ 01 июня 2018

Ладно, проблема в том, что forEach не работает с oldArray length, что означает 5 раз. Почему это происходит?Это потому, что вы выводите значение с помощью forEach, которое изменяет длину и данные forEach.

. Вы можете проверить, введя console.log(oldArray); в forEach.

var arrayA = ["h", "e", "l", "l", "o"];
var arrayB = [];

function copyArray(oldArray, newArray) {
    var length = oldArray.length;
    for (var i = 0; i < length; i++) {
        var storeElement = oldArray.pop();
        newArray.push(storeElement);
    };
    console.log(oldArray + " old array");
    console.log(newArray + " new array");
}


copyArray(arrayA, arrayB);


var reverseArray = ["h", "e", "l", "l", "o"].reverse();

console.log("reverse array");

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