JS: реверсирует массив, но реверсирует только исходный массив -> ошибка: работает без вывода - PullRequest
0 голосов
/ 30 марта 2019

У меня следующая проблема:

// Обратный массив

Написать функцию, которая принимает массив и переворачивает этот массив на месте.Поведение должно имитировать поведение собственного метода массива .reverse ().Однако ваша обратная функция должна принимать массив для работы в качестве аргумента, а не вызываться в качестве метода для этого массива.

Не используйте собственный метод .reverse () в собственной реализации.

Я попробовал следующий код:

let myArray = [1, 2, 3, 4];


function reverse(myArray) {

  let newArray = []; 

  // pop all of elements from roginal array, and store in new array

  for (i=myArray.length-1; i>=0; i--){
    newArray.push(myArray[i])

    console.log(newArray)
  }

  while (newArray.length){

    myArray.unshift(newArray)
  }


  return myArray; 
}


reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]

Мой код просто продолжает работать, и не выводится файл console.log.Обратите внимание, что я хочу сделать обратное для аргумента входного массива.

Что я делаю не так?Кроме того, что означает while (newArray.length) / что он делает концептуально?

Ответы [ 6 ]

1 голос
/ 30 марта 2019

Вы можете поменять местами первый и последний элемент и начать с самого внутреннего элемента.

function reverse(array) {
    var i = array.length >> 1, // take half of the length as integer
        l = array.length - 1;  // last index value to calculate the other side

    while (i--) [array[i], array[l - i]] = [array[l - i], array[i]];
}

var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

reverse(a);
console.log(...a);
0 голосов
/ 30 марта 2019

Не уверен, зачем вам нужен unshift, вы можете просто выполнить итерацию и вернуть массив, в который вы нажимаете значение

let myArray = [1, 2, 3, 4];

function reverse(myArray) {
  let newArray = [];
  for (i = myArray.length - 1; i >= 0; i--) {
    newArray.push(myArray[i])
  }
  return newArray;
}
console.log(reverse(myArray))
0 голосов
/ 30 марта 2019

Вы можете перебирать массив 'до середины и переключаться между текущим (i) и противоположным (length - i - 1):

const myArray = [1, 2, 3, 4];

function reverse(myArray) {
  const length = myArray.length;
  const middle = Math.floor(length / 2);
  
  for(let i = 0; i < middle; i++) {
    let tmp = myArray[i];
    myArray[i] = myArray[length - i - 1];
    myArray[length - i - 1] = tmp;
  }
}


reverse(myArray);
console.log(myArray) // expected output is [4, 3, 2, 1]
0 голосов
/ 30 марта 2019

Вы можете поменять местами первый и последний элемент в массиве и итеративно поменять местами следующий и предыдущий соответственно.

Вам не нужно посещать полный набор в цикле, получать средний элемент и вращать индексвокруг этого

function reverseInArray(arr){
  let len = arr.length;
  let temp;
  for(let i=0; i < len/2; i++){
  	temp = arr[i];
    arr[i] = arr[len - i - 1];
    arr[len - i - 1] = temp;
  }  
  return arr;
}

console.log(reverseInArray([1,2,3,4,5]));
0 голосов
/ 30 марта 2019

Просто поменяйте местами пары, начиная с любого конца массива, до тех пор, пока не останется ни одного:

function reverse(a) {
    for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
        let tmp = a[i];
        a[i] = a[j];
        a[j] = tmp;
    }
    return a;  // not required, but allows use in an expression
}

В ES2016 вы можете использовать назначения деструктурирования для выполнения свопинга в одной операции без использования временной переменной:

function reverse(a) {
    for (let i = 0, j = a.length - 1; i < j; ++i, --j) {
        [ a[j], a[i] ] = [ a[i], a[j] ];
    }
    return a;
}
0 голосов
/ 30 марта 2019

Здесь:

  while (newArray.length){

    myArray.unshift(newArray)
  }

Вы добавляете к myArray, но не берете из newArray, следовательно, бесконечный цикл.Мне кажется, это должно быть myArray.unshift(newArray.pop()).

...