Реверсировать массив вручную

1

Я изучаю 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] Возможно, я сделал здесь что-то глупое, но все-таки вы можете указать мне, где ошибка? Спасибо!

  • 0
    y = x не копирует массив, он просто создает вторую ссылку на него. Не забудьте также объявить меня .
  • 0
    Я надеюсь, что это просто какое-то "упражнение" - потому что Array # reverse
Теги:
arrays
reverse

5 ответов

2
Лучший ответ

Эта строка:

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;
}
  • 0
    Да, это действительно работает. Спасибо!
3

Вы можете зацикливаться до середины измененного массива. И просто меняйте элементы

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))
  • 0
    Поскольку автор только студенческий, я бы предложил сделать ваше решение более простым. Или хотя бы объяснить это.
  • 0
    @blewherself Какая часть, по вашему мнению, требует дополнительного объяснения?
Показать ещё 3 комментария
2

Вы также изменяете исходный массив, когда вы пишете 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]))
  • 0
    Дело в том - мне нужно изменить исходный массив :) Может быть, это не очень практично, но для образовательных целей
  • 0
    В этом случае просто сделайте то же самое в конце x = y и затем return x
Показать ещё 1 комментарий
0

Попробуйте это, это заменит исходный массив в соответствии с вашим требованием:

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;
}
  • 0
    Это не эквивалентно. Один из них обратит массив, другой создаст новый массив, обратный первому массиву.
0

На самом деле вы переопределяете исходный массив, поэтому вам нужно клонировать массив во временную переменную, а затем переопределять значения

value = [1, 2, 3, 4, 5];

но вы можете сделать это непосредственно с помощью этой функции

console.log(value.reverse());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню