Сортировка массива на основе значений из другого массива

Есть два массива:

let name = ["colin", "amandba", "amandab", "carol", "paul", "joseph"]
let rang = [58, 172, 172, 270, 108, 79]

Значение из массива name соответствует значению массива rang по индексу (например, colin = 58, amandba = 172 и т.д.)

Необходимо отсортировать массив name на основе значений из массива rang (в порядке убывания - от большего rang к меньшему rang)

Если значения в массиве name имеют одинаковые значения в rang (amandba = 172 и amandab = 172) - такие значения нужно отсортировать в алфавитном порядке)

Должно получиться:

["carol", "amandab", "amandba", "paul", "joseph", "colin"]

Подскажите пожалуйста, как сделать такую сортировку.


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

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

Задача сводится к двум действиям:

  1. получить словарь, где ключом будет слово, и значением rang. Для этого можно воспользоваться методом .reduce:

    var map = name.reduce((acc, cur, index)=>{
        acc[cur] = rang[index];
        return acc;
    },{});
    
  2. отсортировать массив, проверяя значения из словаря и в случае их равенства сравнивая строки:

    var sorted = name.sort((a,b)=>{
        var rangA = map[a];
        var rangB = map[b];
    
        if (rangA != rangB) return rangB-rangA; // сравниваем ранг
    
        // сравниваем строки
        if (a < b) return 1;
        if (a > b) return -1;
        return 0;
    })
    
→ Ссылка