Метод sort() в массиве объектов

function sortByAge(arr) {
  arr.sort((a, b) => a.age - b.age);
}

let vasya = { name: "Вася", age: 25 };
let petya = { name: "Петя", age: 30 };
let masha = { name: "Маша", age: 28 };

let arr = [ vasya, petya, masha ];

sortByAge(arr);

// теперь отсортировано: [vasya, masha, petya]
alert(arr[0].name); // Вася
alert(arr[1].name); // Маша
alert(arr[2].name); // Петя

Вот пример кода, как работает параметры a и b в методе sort. Конкретнее, например, почему 'a.age' берет сначало именно vasya, а 'b' берет petya. Тоесть почему такой порядок, как потом 'a' берет 'masha', и так далее. Надеюсь объяснил


Ответы (2 шт):

Автор решения: MBo

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

Внутри сортировки происходит сравнение пар элементов и элементы упорядочиваются соответственно результату сравнения.

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

→ Ссылка
Автор решения: Алексей Р

Чтобы посмотреть, какие именно сравнения происходят внутри функции сортировки, можно просто вывести это в консоль:

let step = 1

function sortByAge(arr) {
    arr.sort((a, b) => {
        console.log(`Сравнение № ${step++}: ${a.name} (a) c ${b.name} (b)`)
        return a.age - b.age
    });
}

let vasya = {name: "Вася", age: 25};
let petya = {name: "Петя", age: 30};
let masha = {name: "Маша", age: 28};

let arr = [vasya, petya, masha];

sortByAge(arr);
console.log(arr)

В данном случае сравнение выполняется 4 раза, причем Маша с Петей сравниваются дважды.

→ Ссылка