У меня есть такой массив:
let mixedArr = ["Ship", "Ship", "Boat", "Ship", "Boat", "yacht" ]
Мне нужен результат, который сортирует массив по внешнему виду, например:
let sortedMixedArr = ["Ship", "Boat", "Yacht"]
Кто может предложить решение?
это не имеет ничего общего с уникальностью, но с подсчетом.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно подсчитать элементы, а затем отсортировать записи по количеству
let mixedArr = ["Ship", "Ship", "Boat", "Ship", "Boat", "yacht" ]
console.info(
sortByCount(mixedArr)
)
function sortByCount(arr) {
return [...arr.reduce((map, item) => {
if (map.has(item)) {
map.set(item, map.get(item) + 1)
} else {
map.set(item, 1)
}
return map
}, new Map).entries()] // create [[name, count]]
.sort(([_, a], [__, b]) => b - a) // sort by count numerically
.map(([name]) => name) // extract names
}Более короткий подход с использованием ключей карты и сортировкой их по количеству.
var array = ["Ship", "Ship", "Boat", "Ship", "Boat", "Yacht"],
map = array.reduce((m, v) => m.set(v, (m.get(v) || 0) + 1), new Map),
result = [...map.keys()].sort((a, b) => map.get(b) - map.get(a));
console.info(result);Спасибо. Это то, что я искал - более эффективный способ, чем в предыдущих постах. (отсюда и "эффективный" в заголовке)
@ falcon25 Это не «более эффективный способ», чем мой ответ. Это делает в основном то же самое. На самом деле sort это делает общий алгоритм O(n*log(n)) сложным. Дополнительное отображение не влияет на сложность.
Спасибо, Юрий, также очевидно, и да, я имел в виду более короткий код, а не временную сложность.
Это вообще не сортировка. Разве ты не хочешь просто
mixedArr.filter((value, index, array) => array.indexOf(value) === index)?