// input
let arr = ['foo', 'bar', 'bar', 'baz', 'wtf', 'foo', 'wtf', 'wtf', 'wtf', 'foo'];
// output
['wtf', 'foo', 'bar', 'baz']
Object.entries(arr.reduce((a, b) => ({ ...a, [b]: (a[b] || 0) + 1}), {})).sort(([,a],[,b]) => b - a).map(([a]) => a);
const acc = arr.reduce((acc, el) => ({...acc, [el]: (acc[el] || 0) + 1}), {});
const sortedArr = Object.keys(acc).sort((a, b) => acc[b] - acc[a]);
[...arr.reduce((acc, c) => (acc.set(c, (acc.get(c) ?? 0) + 1), acc), new Map()).entries()]
.sort((a, b) => b[1] - a[1]).map((el) => el[0])
Собрать словарь (значение: счётчик)
, из него массив пар [key, value]
отсортировать по убыванию второго; оставить только первые.