Сортировать массив объектов по свойствам

Задание: Напишите функции сортировки sortByName и sortByHeight, которые смогут отсортировать массив по именам (в алфавитном порядке) или росту (по убыванию роста). Вызовите только функцию сортировки по росту.

Нужна помощь по созданию этих функции. Я написал вот такой код, но это не работает:

// Это наш массив с объектами
let humans = [];

humans[0] = new Human("Коля", 23, 180);
humans[1] = new Human("Даша", 19, 170);
humans[2] = new Human("Ваня", 18, 192);
humans[3] = new Human("Петя", 45, 178);
humans[4] = new Human("Вася", 34, 197);
humans[5] = new Human("Джони", 40, 168);
humans[6] = new Human("Катя", 37, 160);
humans[7] = new Human("Петя", 29, 200);
humans[8] = new Human("Соня", 21, 172);
humans[9] = new Human("Женя", 25, 175);

class Human {

    constructor(name, age, height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    getInfo() {
        return `${this.name}, ${this.age}, ${this.height}`;
    }

    get firstName() {
        return this.name;
    }

    get getAge() {
        return this.age;
    }

}

/////////////////////sorting functions/////////////////////

function sortByName() {
    return console.log(humans.name.sort());
}

function sortByHeight() {
    
    return console.log(humans.height.sort(sortByNumber));
}

function sortByNumber(a, b) { return a - b; }

sortByHeight(); 

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

Автор решения: Gene Erbin

Во-первых, в выражении humans.height идёт обращение к несуществующему полю массива, если хотите обратиться к полю объекта внутри этого массива, то надо указать соответствующий индекс, например, humans[0].height.

Во-вторых, в функции сортировки надо указать конкретное поле объекта, по которому будет выполняться сортировка - a.name, a.height, а не объекта в целом, как указано в Вашем примере - function sortByNumber(a, b) { return a - b; }.

Ниже представлен рабочий вариант функций сортировки по росту и имени.

class Human {

    constructor(name, age, height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    getInfo() {
        return `${this.name}, ${this.age}, ${this.height}`;
    }

    get firstName() {
        return this.name;
    }

    get getAge() {
        return this.age;
    }

}

// Это наш массив с объектами
let humans = [];

humans[0] = new Human("Коля", 23, 180);
humans[1] = new Human("Даша", 19, 170);
humans[2] = new Human("Ваня", 18, 192);
humans[3] = new Human("Петя", 45, 178);
humans[4] = new Human("Вася", 34, 197);
humans[5] = new Human("Джони", 40, 168);
humans[6] = new Human("Катя", 37, 160);
humans[7] = new Human("Петя", 29, 200);
humans[8] = new Human("Соня", 21, 172);
humans[9] = new Human("Женя", 25, 175);

/////////////////////sorting functions/////////////////////

function sortByName() {
    return console.log(humans.sort(sortByString));
}

function sortByHeight() {
    
    return console.log(humans.sort(sortByNumber));
}

function sortByNumber(a, b) { return b.height - a.height; }

function sortByString(a, b) { return a.name.localeCompare(b.name); }

sortByName();
sortByHeight();

→ Ссылка