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) должна менять исходный массив на обратный. Почему этот код возвращает просто пустой массив? В чем ошибка?
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. Во-вторых, не вырезать элементы из исходного массива. В третьих, поскольку для изменения на месте переопределять переменную, ссылающуюся на исходный массив нельзя, то необходимо:
pop и push, а вообще это совершенно необязательно)Рабочий алгоритм описал в своем ответе @Igor, можете посмотреть там.
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);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости