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);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно как-то симулировать клик по определенному элементу на сайте https://csmoney/ (в div#inventory_bot)
Добрый вечер, есть js код который при наведении на элемент списка, показывает подменюНо если быстро выводить и убирать мышку с пределов блока...
Можете подсказать код для сортировки select'a по алфавиту через JSГуглил пользовательскую сортировку в JS, но все время выдает только сортировку...