我在这个jsbin example 中使用了lodash 和纯JavaScript 数组方法的组合:
var arr = [3,4,5,5,5,6,8,3,12,1,1,1];
var sorted = _.sortBy(_.toPairs(arr.reduce(function(agg, curr) {
agg[curr] = agg[curr] ? agg[curr] + 1 : 1;
return agg;
}, {})), function(pair) {
return -pair[1];
}).map(function(pair) {
return pair[0];
});
console.log(sorted); // => ["1", "5", "3", "4", "6", "8", "12"]
但是,"5" 和 "1" 的顺序与 3,4,6,8,12 的顺序不同,因为没有为具有相同计数的数字指定排序顺序。
上面所做的是创建一个number=>count 的映射(例如{ "1": 3, "5": 3 }),然后将它们配对为元组(因为在JavaScript 中无法确定地对对象进行排序:[["1", 3], ["5", 3]])。然后,我们简单地根据计数对元组集合进行排序,并映射元组集合以仅返回数字(例如["1", "5", /* etc. */ ])。