JavaScript для тупых
  • JavaScript для тупых
  • Главная
  • Об учебнике
  • Формат обучения
  • Ввод в JavaScript. Что это? И для чего нужен?
  • Братки JavaScript-а
  • Переменные в JavaScript
  • Переменные. const, let, var
  • Преобразование типов
  • Операторы сравнения
  • Типы данных. Number
  • Типы данных. String
  • Типы данных. Boolean
  • Типы данных. null и undefined
  • Типы данных. Оператор typeof
  • Условные операторы: if и ?
  • Циклы: while, for
  • Операторы
  • Логические операторы
  • Знакомство с switch
  • Функции
  • Функции. Возврат значения
  • Стрелочные функции
  • Знакомство с DOM
  • DOM-элементы. Получение объектов
  • DOM-элементы. События. Ввод.
  • DOM-элементы. События. Часть 2
  • Объекты. Начало игры
  • Массивы
  • Методы массивов: splice, slice, concat
  • Методы массивов: find, findIndex, filter
  • Методы массивов: map, sort
  • Методы массивов: reverse, split, join
  • Методы массивов: indexOf, lastIndexOf, includes
  • Методы массивов: reduce, spread
  • Методы массивов: Array.isArray, some, every
  • Методы массивов: flat, fill
  • Планирование вызова функции: setTimeout
  • Планирование вызова функции: setInterval
  • Объекты. Свойства.
  • Объекты. Методы
  • this, call, apply, bind
  • Замыкания
  • Прототипы
  • Promises (Обещания)
Powered by GitBook
On this page

Was this helpful?

Методы массивов: map, sort

JavaScript простым языком

PreviousМетоды массивов: find, findIndex, filterNextМетоды массивов: reverse, split, join

Last updated 4 years ago

Was this helpful?

Метод map

Метод map создает новый массив из элементов, которые будут являться результатами выполнения callback-функции.

У метода map имеется только один аргумент, который является callback-функцией. У этой функции имеется 3 аргумента, по аналогии с методами описанными ранее:

Первый аргумент – текущей элемент (элемент на текущей итерации).

Второй аргумент – индекс этого элемента в массиве.

Третий аргумент – сам массив.

Повторюсь, callback-функция может быть как обычной (function declaration), так и стрелочной (arrow function).

Пример использования:

const numbers = [2, 5, 7, 9];
const results = numbers.map(n => n ** 5);

results; // [32, 3125, 16807, 59049]

Из исходного массива numbers, с помощью метода map мы создали новый массив, в котором каждое число было возведено в 5-ю степень.

Метод sort

Метод sort, как несложно догадаться по названию – сортирует массив. При этом, сортирует он его на месте, что означает изменение исходного массива. Плюсом к этому, данный метод еще и возвращает тот же самый массив, т.е. результат выполнения данного метода можно ещё и в другую переменную запихнуть (но это делается крайне редко).

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

const characters = ['d', 'z', 'a', 'c', 'y'];
characters.sort();

characters; // ['a', 'c', 'd', 'y', 'z']

Как видишь, метод расположил буквы в соответствии с их расположением в латинском алфавите. Но что же будет, если применить метод sort к массиву с числами? Глянем:

const numbers = [45, 4, 2, 1, -50, 300, 0];
numbers.sort();

numbers; // [-50, 0, 1, 2, 300, 4, 45]

И казалось бы, что может пойти не так?! Но, всмотрись внимательно и увидишь, что значение 300 заняло далеко не своё место в этом танце =) Почему так? ПотомуШТА =). А если серьезно, то случилось это по той причине, что метод sort по умолчанию при работе с элементами массива преобразует их (элементы) к строковому типу и для сортировки применяется лексикографический порядок. А если сравнивать строки, то строка 300 будет больше чем строка 4. Чтобы такой чепухи не было, нам нужно задать свой порядок сортировки.

Ты же заметил, что мы не передавали никакого аргумента в метод sort, а они у него есть. И да, это снова callback-функция. Если ты ее передашь, то она будет (должна) задавать правила сортировки для массива.

Главное правило callback-функции для данного метода – для пары значений она должна возвращать:

  • 1 (или любое положительное число) – если первое значение больше второго;

  • 0 – если значения равны;

  • -1 (или любое отрицательное число) – если первое значение меньше второго.

Теперь подкрепим понимание кодом:

const numbers = [45, 4, 2, 1, -50, 300, 0];

function compare(a, b) {
   if (a > b) return 1;
   if (a === b) return 0;
   if (a < b) return - 1;
};

numbers.sort(compare);

numbers; // [-50, 0, 1, 2, 4, 45, 300]

Вот оно, чудо из всех чудес! Теперь сортировка отработала совершенно правильно.

Что же мы поменяли? Да в целом, ничего. Мы создали функцию, в которой описали при каких условиях и что возвращать, используя правило выше. И эту функцию мы передали в аргумент метода. И все заработало как часы.

Конкретно данный случай можно еще и упростить, если использовать стрелочную функцию и немного включить логику. Смотри:

const numbers = [45, 4, 2, 1, -50, 300, 0];

numbers.sort((a, b) => a - b);

numbers; // [-50, 0, 1, 2, 4, 45, 300]

Воу! Код колоссально сократился, но чего же мы такого тут поменяли?

Во-первых, мы ввели стрелочную функцию, что автоматически в львиной доле случаев делает код короче.

Во-вторых, посмотри на эту функцию: (a, b) => a - b. Здесь так же фигурируют a и b, как и в примере выше и мы возвращаем их разницу. Зачем?

Ты не забыл о главном правиле? Функция должна вернуть 1 (или любое положительное число), 0 или -1 (или любое отрицательное число).

Именно это здесь и вернется. Если числа будут равны, то результат a - b даст нам значение 0. Если a > b, то нам вернется положительное число, если a < b, то вернётся отрицательное число. Таким образом, правило у нас исполнится и метод отработает как нужно.

Generic badge