Я изучаю JS и придерживаюсь этой вещи. Мне нужно изменить массив на функцию, которая принимает аргумент как значение. Как это:
value = [1, 2, 3, 4, 5];
reverse(value);
console.log(value);
//[5, 4, 3, 2, 1]
Я написал эту функцию и не могу понять, почему она не будет работать:
function reverseArrayInPlace(x){
var p = 0, y = x;
for(i = y.length-1; i>=0; i--){
x[p] = y[i];
p++;
}
return x;
}
Он возвращает это: [5, 4, 3, 4, 5] Возможно, я сделал здесь что-то глупое, но все-таки вы можете указать мне, где ошибка? Спасибо!
Эта строка:
var p = 0, y = x;
Сохраняет ссылку на массив, хранящийся в x
, в переменную y
. Другими словами, x
и y
указывают на один и тот же массив.
Чтобы исправить это, создайте новый массив:
function reverseArrayInPlace(x) {
var p = 0, y = [];
for (i = x.length-1; i>=0; i--) {
y[p] = x[i];
p++;
}
return y;
}
Если вам абсолютно необходимо изменить исходный массив, просто скопируйте обратный массив обратно в оригинал:
function reverseArrayInPlace(x) {
var p = 0, y = [];
for (i = x.length-1; i>=0; i--) {
y[p] = x[i];
p++;
}
for (var i = 0; i < y.length; i++) {
x[i] = y[i];
}
return x;
}
Вы можете зацикливаться до середины измененного массива. И просто меняйте элементы
function reverseArrayInPlace(x) {
for (var i = 0, last = x.length - 1, mid = last/2, tmp; i <= mid; i++) {
tmp = x[i];
x[i] = x[last - i];
x[last - i] = tmp;
}
return x;
}
const arr = [1,2,3,4,5]
reverseArrayInPlace(arr)
console.log(JSON.stringify(arr))
const arr2 = [1, 2, 3, 4, 5, 6]
reverseArrayInPlace(arr2)
console.log(JSON.stringify(arr2))
Вы также изменяете исходный массив, когда вы пишете y=x
когда они копируются по ссылке.
Вместо этого сделайте следующее:
function reverseArrayInPlace(x) {
var p = 0, y = [];
for (i = x.length - 1; i >= 0; i--) {
y[p] = x[i];
p++;
}
return y;
}
console.log(reverseArrayInPlace([1, 2, 3, 4, 5]))
x = y
и затем return x
Попробуйте это, это заменит исходный массив в соответствии с вашим требованием:
value = [1, 2, 3, 4, 5];
value = value.reverse();
console.log(value);
или вы можете сделать вот так:
value = [1, 2, 3, 4, 5];
reverse(value);
console.log(value);
function reverse(x) {
var p = 0, y = [];
for (i = x.length - 1; i >= 0; i--) {
y[p] = x[i];
p++;
}
value = y;
}
На самом деле вы переопределяете исходный массив, поэтому вам нужно клонировать массив во временную переменную, а затем переопределять значения
value = [1, 2, 3, 4, 5];
но вы можете сделать это непосредственно с помощью этой функции
console.log(value.reverse());
y = x
не копирует массив, он просто создает вторую ссылку на него. Не забудьте также объявить меня .