javascript - 排序数组并按出现次数分组
问题描述
在输入
array = [ 1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20 ]
输出就像
[ [ 1, 1, 1, 1 ], [ 2, 2, 2 ], 4, 5, 10, [ 20, 20 ], 391, 392, 591 ]
尝试了以下函数来创建结果:
var array = [ 1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20]
function answer(ArrayFromAbove) {
var length = array.length;
for (var i = 0; i < length; i++) {
for (var j = 0; j < (length - i - 1); j++) {
if (array[j] > array[j + 1]) {
var tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
}
answer(array);
console.log(array);
应该返回:
[ [ 1, 1, 1, 1 ], [ 2, 2, 2 ], 4, 5, 10, [ 20, 20 ], 391, 392, 591 ]
解决方案
您可以考虑reduce
改为使用,计算每个数字的出现次数,然后迭代排序的条目并将值推送到结果数组(作为数组,如果有多个值,或者只是一个普通数字,如果只有一个):
const input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];
/* create an object like:
{
"1": 4,
"2": 3,
"4": 1,
"5": 1,
"10": 1,
"20": 2,
"391": 1,
"392": 1,
"591": 1
} */
const inputCounts = input.reduce((a, num) => {
a[num] = (a[num] || 0) + 1;
return a;
}, {});
const output = Object.entries(inputCounts)
// turn (string) key to number:
.map(([key, val]) => [Number(key), val])
.sort((a, b) => a[0] - b[0])
.reduce((a, [num, count]) => {
a.push(
count === 1
? num
: new Array(count).fill(num)
);
return a;
}, []);
console.log(output);
推荐阅读
- mysql - SQL 中没有第二个子查询的计数
- python - 使用 matplotlib 的奇怪形状的箱线图
- javascript - 我如何查询这个 Firebase structyre
- c# - C#从checkedlistbox插入自定义值选择项到dataviewgrid
- javascript - config.json(TypeError:仅支持绝对 URL)
- sql - 将带有嵌套对象的 JSON 数据读取到 SQL Server 2016
- django-models - Django:如何为 slug 字段获得正确的数字排序?
- html - 如何在 tumblr 上将 h2 样式文本设置为两种颜色?
- google-apps-script - 我尝试了 Programmable-Hide-Unhide-Columns-from-Dropdown-Menu
- jquery - springboot thymleaf中的jquery数据表