JavaScript | Как перевернуть массив без метода reverse?

JavaScript | Как перевернуть массив без метода reverse?

Как перевернуть элементы массива без использования метода reverse()?

Для переворота напишем две версии одной функции. Мы будем использовать цикл for, который будет проходить по каждому элементу массива и присваивать значения элементам нового массива. Наша функция будет удобнее стандартного reverse(), потому что она будет возвращать нам новый массив, а не изменять существующий. Так мы не нарушим оригинальный массив, который может участвовать в других логических частях алгоритма (программы).

 

Логика работы функции

Создаём итератор при помощи цикла for. Он просто пробегается по каждому индексу оригинального массива. Он стартует с индекса 0 (ноль) и заканчивает свою работу при значении (длина массива минус один). Например, если длина массива равна пяти (5), то последний индекс в цикле будет четыре (4), т. к. индексы в массивах стартуют от нуля (0) и в условии используются только целые числа.

Для остановки работы цикла мы используем условие что индекс меньше длины массива — это по сути предыдущее целое положительное число до длины массива.

На каждой итерации цикла мы увеличиваем значение индекса на один (1). Так мы всегда будем получать целые положительные числа.

Внутри цикла мы объявим переменную «a», в которую положим пустой массив. Он будет наполняться на каждой итерации цикла. Мы замкнём переменную «a» внутри этой функции. Эта переменная никогда не сможет увидеть мир вне тела функции — переменная «a» ни на что больше не повлияет. Это называется «область видимости» переменной.

На каждой итерации цикла будет происходить присваивание новых значений элементам нового массива. Например, для любого элемента массива «a» под индексом N будет присвоено значение:

Оригинальный массив[(Длина оригинального массива минус 1) минус индекс элемента нового массива]
  • минус 1 — это «индексный сдвиг», который есть во всех массивах т. к. индексы начинаются не с единицы, а с нуля
  • Длина оригинального массива минус 1 — так мы всегда будем получать номер последнего индекса оригинального массива т. е. его последний элемент. Мы будем знать на каком целом числе заканчивается индексация оригинального массива.
  • (Длина оригинального массива минус 1) минус индекс элемента нового массива — так мы всегда будем на шаг изменять номер индекса оригинального массива в сторону убывания. Будем идти с конца в начало по оригинальному массиву. Вся эта конструкция будет возвращать нам индекс «противоположного» элемента для нового массива
  • В оригинальном массиве мы будем обращаться по просчитанному индексу

 

Пример

Когда индекс в цикле стартанёт с нуля, то конструкция a[0] будет ждать значения для первого элемента нового массива. В этот момент произойдёт вычисление this[(this.length — 1) — 0] последнего элемента из оригинального массива. С ростом индекса новый массив движется к концу, а оригинальный массив к началу.

 

Версия для работы с объектами-прототипами Array

Мы можем упростить себе работу и расширить стандартный список методов Array своим собственным. Например анонимной функцией:

function (){
   var a = [];
   for (i = 0; i < this.length; i++){
      a[i] = this[(this.length - 1) - i]
   }
   return a
}

Как это работает? Объявляем новый метод для работы с прототипами Array. Даём ему созвучное имя, чтобы вызывать в «цепочках» точек. Пусть он будет называться «pereverniMassiv«.

Array.prototype.pereverniMassiv = function(){
   var a = [];
   for (i = 0; i < this.length; i++){
      a[i] = this[(this.length - 1) - i]
   }
   return a
}

Мы обращаемся к конструктору объектов Array и при помощи его свойства prototype создаём своё собственное свойство для прототипов.

Новый метод pereverniMassiv для прототипов Array - JavaScript
Новый метод pereverniMassiv для прототипов Array — JavaScript

 

Таким способом мы расширили список методов для прототипов Array и теперь можем вызвать его на любых массивах в «цепочках» без слова function.

Например,

Вызов самописного метода на анонимном массиве - JavaScript
Вызов самописного метода на анонимном массиве — JavaScript

Или,

Вызов join после самописного метода - JavaScript
Вызов join после самописного метода — JavaScript

 

Версия для отдельного использования

Есть именованная функция, которая объявляется и живёт сама по себе:

function newReverse (x){
   var a = [];
   for (i = 0; i < x.length; i++){
      a[i] = x[(x.length - 1) - i]
   }
   return a
}

 

Есть массив:

var massiv = [11, 22, 33, 44, 55]

Мы передаём в функцию один массив.

newReverse(massiv)
Переворот массива через отдельную функцию с передачей одного аргумента - JavaScript
Переворот массива через отдельную функцию с передачей одного аргумента — JavaScript

 

 

Информационные ссылки

JavaScript | Как перевернуть массив?

JavaScript | Массивы (Array)

Стандарт ECMAScript — Array.prototype — https://tc39.es/ecma262/#sec-array.prototype