Обратный массив с петлями

Quarrck reverseArrayavScrarrpt вопрос. В следующих частях кода я изменяю newArray arr, который передается функции 3.

В первом фрагменте кода выглядит так, что локальная переменная продолжает меняться, хотя внутри цикла я работаю над переменной, которая содержит начальное значение . Следовательно, цикл выходит из строя, когда функция reverseArray ( arr ) { var numArr = arr . длина ; var newArr = []; for ( i = 0 ; i < numArr ; i ++) { let inArr = arr ; newArrfunction reverseArray (arr) { var newArr = []; var inArr = arr; console.log(inArr); for (i = 0; i < arr.length; i++) { newArr[i] = inArr.pop(i); } return newArr; } reverseArray(["A", "B", "C", "D", "E", "F"]); // OUTPUT: ["F", "D", "E"]arr.lengthnumArr [ i ] = inArr . pop ( i ); } return newArr ; } reverseArray ([ «A» , «B» , «C» , «D» , «E» , «F» ]); // OUTPUT: ["F", "E", "D", "C", "B", "A"] достигает значений . pop

inArr.pop(1)

С другой стороны, если я храню arr.lengthлокальную переменную inArr, то она отлично работает и меняет массив.

pop

Что мне не хватает?

javascript,arrays,for-loop,

2

Ответов: 4


2 принят

j( MDN , spec ) является мутаторным методом: он изменяет состояние массива, на который вы его вызываете. Поэтому, естественно, inArrизменяется arr(в вашем первом примере), так как iи arrоба относятся к одному и тому же массиву.

Возможно, стоит отметить, что popон не принимает никаких параметров, поэтому 1ничего не делает.

В вашем первом примере лучше всего просто назначить другую переменную (скажем, j) начальное значение и использовать для получения значения, а затем уменьшить по мере увеличения . (Кроме того, нет смысла , и вам нужно объявить, чтобы избежать того, что я называю «Ужасом неявных глобалов» :function reverseArray (arr) { var newArr = []; for (var i = 0, j = arr.length - 1; i < arr.length; i++, j--) { newArr[i] = arr[j]; } return newArr; } console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));arr[arr.length - i - 1]jifunction reverseArray (arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { newArr[i] = arr[arr.length - i - 1]; } return newArr; } console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));i

function reverseArray(array) {
    var newArr = [],
        inArr = array.slice();    // take copy of primitive values

    while (inArr.length) {        // check decrementing length
        newArr.push(inArr.pop());
    }
    return newArr;
}

console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));

Вы также можете использовать forвместо второй переменную:

function reverseArray(array) {
    var newArr = [],
        inArr = array.slice();    // take copy of primitive values

    for(; inArr.length; ) {       // check decrementing length
        newArr.push(inArr.pop());
    }
    return newArr;
}

console.log(reverseArray(["A", "B", "C", "D", "E", "F"]));


3

Вы можете взять копию массива и использовать длину копии, проверяя следующую команду pop / push.

arr

Чтобы выполнить это условие, вы также можете использовать forинструкцию.

arr


0

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

поэтому ваш код работал так

1st pass: i=0 and arr.length = 6; // 0<6 true
2nd pass: i=1 and arr.length = 5; // 1<5 true
3rd pass: i=2 and arr.length = 4; // 2<4 true
4th pass: i=3 and arr.length = 3; // 3<3 false and it does not execute

поэтому вы видите только три результата.


-1

Вы можете попробовать использовать этот код:

function reverseString(str) {
    var newString = "";
    for (var i = str.length - 1; i >= 0; i--) {
       newString += str[i];
    }

    return newString;
}
JavaScript, массивы, для цикла,
Похожие вопросы