Javascript 按出现次数按升序对元素数组排序

Javascript 按出现次数按升序对元素数组排序,javascript,arrays,sorting,ecmascript-6,Javascript,Arrays,Sorting,Ecmascript 6,有这样一个数组:[4,2,6,1,2,5,2,4] 有一次出现1、5、6 两次发生4 三次发生2 首先,必须按升序添加出现一次的元素:1,5,6 之后,将出现两个元素:1,5,6,4,4 以及三个出现的元素:1,5,6,4,4,2,2,2 我尝试对数组进行排序,然后将出现次数较多的元素移动到数组末尾,但效率不高 有什么想法吗?您可以使用arrayarray.prototype.reduce方法计算频率,然后按出现次数升序排序 让arr=[4,2,6,1,2,5,2,4]; arr=Object

有这样一个数组:
[4,2,6,1,2,5,2,4]

有一次出现1、5、6 两次发生4 三次发生2

首先,必须按升序添加出现一次的元素:
1,5,6

之后,将出现两个元素:
1,5,6,4,4

以及三个出现的元素:
1,5,6,4,4,2,2,2

我尝试对数组进行排序,然后将出现次数较多的元素移动到数组末尾,但效率不高


有什么想法吗?

您可以使用array
array.prototype.reduce
方法计算频率,然后按出现次数升序排序

让arr=[4,2,6,1,2,5,2,4];
arr=Object.entries(
arr.reduce((上一个,c)=>{
常数p=上一个;
p[c]=p[c]??0;
p[c]+=1;
返回p;
}, {})
)
.sort((x,y)=>x[1]-y[1])
.flatMap(([x,y])=>数组(y).fill(+x));

控制台日志(arr)
您可以使用array
array.prototype.reduce
方法计算频率,然后按出现次数升序排序

让arr=[4,2,6,1,2,5,2,4];
arr=Object.entries(
arr.reduce((上一个,c)=>{
常数p=上一个;
p[c]=p[c]??0;
p[c]+=1;
返回p;
}, {})
)
.sort((x,y)=>x[1]-y[1])
.flatMap(([x,y])=>数组(y).fill(+x));

控制台日志(arr)
首先,您需要计算数组中每个数字的出现次数,我们将使用
reduce
进行此操作,如下所示:

let count = arr.reduce((acc, n) => {
  acc[n] = (acc[n] || 0) + 1;
  return acc;
}, {});
这将生成一个对象,其中键是数字,值是它们在数组中出现的次数
arr

然后,我们将首先根据该计数对项目进行排序,然后再根据数字本身进行排序:

arr.sort((a, b) => (count[a] - count[b]) || (a - b));
(count[a]-count[b])| |(a-b)
使用短路评估,这会导致按计数/出现次数升序排序,然后按数字本身排序,如果
count[a]-count[b]==0
(意味着数字
a
b
具有相同的计数)

演示:

让arr=[4,2,6,1,2,5,2,4];
让计数=arr.reduce((acc,n)=>{
acc[n]=(acc[n]| 0)+1;
返回acc;
}, {});
arr.sort((a,b)=>(count[a]-count[b])| |(a-b));

console.log(“[”+arr.join(“,”+“])
首先,您需要计算数组中每个数字的出现次数,我们将使用
reduce
进行此操作,如下所示:

let count = arr.reduce((acc, n) => {
  acc[n] = (acc[n] || 0) + 1;
  return acc;
}, {});
这将生成一个对象,其中键是数字,值是它们在数组中出现的次数
arr

然后,我们将首先根据该计数对项目进行排序,然后再根据数字本身进行排序:

arr.sort((a, b) => (count[a] - count[b]) || (a - b));
(count[a]-count[b])| |(a-b)
使用短路评估,这会导致按计数/出现次数升序排序,然后按数字本身排序,如果
count[a]-count[b]==0
(意味着数字
a
b
具有相同的计数)

演示:

让arr=[4,2,6,1,2,5,2,4];
让计数=arr.reduce((acc,n)=>{
acc[n]=(acc[n]| 0)+1;
返回acc;
}, {});
arr.sort((a,b)=>(count[a]-count[b])| |(a-b));

console.log(“[”+arr.join(“,”+“])