javascript - 根据它们出现的频率对数组项进行排序 Javascript
问题描述
Input: [2,1,9,1,2,5,1,6,1]
Output: [5,6,9,2,2,1,1,1,1]
按照上面的转换。
如果频率相同,则要保持升序,即 5、6、9 具有相同的频率,即 1,因此它们按升序添加,然后是 2(频率 2)和 1(频率 4)。
请帮助如何使用javascript实现这一点
解决方案
使用为对象累加器中的每个数字创建一个频率对象array#reduce
,然后根据此对象对数组进行排序,对于具有相同频率的数字,按它们的值对它们进行排序。
const arr = [2,1,9,1,2,5,1,6,1],
frequency = arr.reduce((r,v) => {
r[v] = (r[v] || 0) + 1;
return r;
}, {});
arr.sort((a,b) => frequency[a] - frequency[b] || a - b);
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- python - worker 中的 Python 版本不同:环境变量设置正确
- angularjs - 如何在 AngularJs 中使用 data-ng-start 和 end 条件绑定表值
- vaadin - Vaadin addComponentColumn 仅适用于最后一行
- mysql - 如何将这些行与逗号一起作为我的选择中的一列?
- database - Mongos shell 不显示在分片上创建的集合
- unix - 我的 vim 不断显示有关 diff 和 gzip 的错误
- ios - 错误:嵌入式二进制文件未使用与父应用程序相同的证书进行签名。Xcode
- c# - 如何将我的 .cs 类与我的 .aspx 类连接起来?
- android - 渐变颜色可绘制在 Android 10 上无法正常工作(旋转 90 度)
- regex - 正则表达式:只接受整数和空字符串,但不接受其他符号,如 (+ , -, . 等)