Разворот массива

201
17 марта 2018, 19:26

function reverseArray(array) { 
  var arrayTemp = array; 
  var arrayResult = []; 
  var arrayLength = array.length 
 
  for (var i = 0; i <= arrayLength - 1; i++) { 
    arrayResult.push(arrayTemp.pop()) 
  } 
  return arrayResult 
 
} 
 
function reverseArrayInPlace(array) { 
  var arrayTemp = array; 
  var arrayResult = []; 
  var arrayLength = array.length 
 
  for (var i = 0; i <= arrayLength - 1; i++) { 
    arrayResult.push(arrayTemp.pop()) 
  } 
 
  array = arrayResult; 
  return array; 
 
} 
 
var arrayValue = [1, 2, 3]; 
reverseArrayInPlace(arrayValue) 
console.log(arrayValue)

Необходимо написать функцию, котораю разворачивает массив (про метод reverse я знаю). Первая (reverseArray) лишь возвращает измененный массив, а вторая (reverseArrayInPlace) должна менять исходный массив на обратный. Почему этот код возвращает просто пустой массив? В чем ошибка?

Answer 1
function reverseArrayInPlace(array) {
  var arrayTemp = array;
  var arrayResult = [];
  var arrayLength = array.length
  for (var i = 0; i <= arrayLength - 1; i++) {
    arrayResult.push(arrayTemp.pop())
  }
  array = arrayResult;
  return array;
}
var arrayValue = [1, 2, 3];
reverseArrayInPlace(arrayValue)
console.log(arrayValue)

На самом деле ваш код работает и работает правильно. Чтобы в этом убедиться, давайте выведем значение, возвращаемое функцией вместо того, чтобы выводить значение исходного массива:

function reverseArrayInPlace(array) { 
  var arrayTemp = array; 
  var arrayResult = []; 
  var arrayLength = array.length 
 
  for (var i = 0; i <= arrayLength - 1; i++) { 
    arrayResult.push(arrayTemp.pop()) 
  } 
 
  array = arrayResult; 
  return array; 
 
} 
 
var arrayValue = [1, 2, 3]; 
let res = reverseArrayInPlace(arrayValue); 
console.log(res); // [3, 2, 1] => работает!

Проблема в том, что внутри функции вы переопределяете переменную array. Эта переменная изначально указывает на исходный массив arrayValue, который вы и пытаетесь изменить "на месте". Вы можете в этом убедиться, добавив в начало функции console.log(array === arrayValue);, которое выведет true.

Так происходит потому, что массивы передаются "по-ссылке", а не при помощи копирования. Поэтому вы можете свободно изменять значения элементов переменной array, тем самым изменяя значения этих же элементов переменной arrayValue снаружи этой функции.

Однако вот этой строчкой:

array = arrayResult;

Вы попросту переопределяете значение переменной array. Поэтому эта переменная больше не указывает на тот же массив, который был изначально (arrayValue). В этом и проблема.

А пустой массив выводится потому, что вы "вырезали" все элементы из исходного массива вот этой конструкцией:

arrayTemp.pop()

При этом arrayTemp === array === arrayValue.

Что делать?

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

  1. Создать копию исходного массива (просто присвоить его новой переменной, как видите, нельзя)
  2. Работать с копией (только если вы хотите оставить алгоритм с pop и push, а вообще это совершенно необязательно)
  3. Поочередно переопределить элементы исходного массива элементами из обработанной копии.
  4. Ничего не возвращать из функции (хотя это опционально и ничего не сломает; просто так принято).

Рабочий алгоритм описал в своем ответе @Igor, можете посмотреть там.

Answer 2

function reverseArrayInPlace(array) { 
  for (var i = 0; i < array.length / 2; i++) { 
    var temp = array[i]; 
    array[i] = array[array.length - 1 - i]; 
    array[array.length - 1 - i] = temp; 
  } 
} 
 
var arrayValue = [1, 2, 3]; 
reverseArrayInPlace(arrayValue); 
console.log(arrayValue);

READ ALSO
Клик на div элемент chrome extention

Клик на div элемент chrome extention

Нужно как-то симулировать клик по определенному элементу на сайте https://csmoney/ (в div#inventory_bot)

177
Эффект гармошки в меню

Эффект гармошки в меню

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

211
JS сортировка select&#39;a

JS сортировка select'a

Можете подсказать код для сортировки select'a по алфавиту через JSГуглил пользовательскую сортировку в JS, но все время выдает только сортировку...

212