Javascript typescript对数组中的重复项进行计数,并根据每个项的计数对结果进行排序

Javascript typescript对数组中的重复项进行计数,并根据每个项的计数对结果进行排序,javascript,arrays,typescript,Javascript,Arrays,Typescript,我有一个数组,它是根据从api调用中拉入的值填充的。 数组将具有如下值 ["9777", "9777", "2.4", "9777", "2.4", "2.4", "9777", "2.4", "2.4", "9777", "9777", "2.4", "2.4", "2.4"] 我试图做的是获取数组中每个项的出现次数,并根据该次数对其进行降序排序 我这样做是从stackoverflow得到的: data.forEach(function (x) { counts[x] = (counts

我有一个数组,它是根据从api调用中拉入的值填充的。 数组将具有如下值

["9777", "9777", "2.4", "9777", "2.4", "2.4", "9777", "2.4", "2.4", "9777", "9777", "2.4", "2.4", "2.4"]
我试图做的是获取数组中每个项的出现次数,并根据该次数对其进行降序排序

我这样做是从stackoverflow得到的:

data.forEach(function (x) {
  counts[x] = (counts[x] || 0) + 1;
});
它是有效的,但它会给出奇怪的结果,这使得从结果中提取值变得困难。 结果如下:

另一种方法是使用函数
reduce
进行计数并创建具有计数的对象,然后使用函数
sort

如果要按“名称”提取特定对象,可以使用函数
find

let array=[“9777”、“9777”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“9777”、“2.4”、“2.4”、“2.4”],
计数=对象.值(数组.减少((a,c)=>{
(a[c]| |(a[c]={name:c,count:0})).count+=1;
返回a;
}排序({count:ac},{count:bc})=>bc-ac),
target=“2.4”,
find=counts.find({name}=>name==target);
控制台日志(计数);
console.log(找到);
console.log(found.count)

.as console wrapper{max height:100%!important;top:0;}
另一种方法是使用函数
reduce
来计数并创建一个具有计数的对象,然后使用函数
sort

如果要按“名称”提取特定对象,可以使用函数
find

let array=[“9777”、“9777”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“9777”、“2.4”、“2.4”、“2.4”],
计数=对象.值(数组.减少((a,c)=>{
(a[c]| |(a[c]={name:c,count:0})).count+=1;
返回a;
}排序({count:ac},{count:bc})=>bc-ac),
target=“2.4”,
find=counts.find({name}=>name==target);
控制台日志(计数);
console.log(找到);
console.log(found.count)

.as-console-wrapper{max-height:100%!important;top:0;}
要做的第一件事是获取唯一的项目列表,然后循环该列表以添加到最终结果中

生成列表后,我们可以使用从上一个操作创建的键
count
对列表进行排序

const items=[“9777”、“9777”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“2.4”、“2.4”、“2.4”、“9777”、“9777”、“2.4”、“2.4”];
//存储结果的地方
常量结果=[];
//创建要循环的项目的唯一列表
//将每个项目添加到结果列表中
[…新集合(项目)].forEach(项目=>result.push({
关键词:项目,,
//获取当前类型的项目计数
计数:items.filter(i=>i==item).length
}));
//将数组从最高到最低排序
结果.排序((a,b)=>b.count-a.count);

控制台日志(结果)要做的第一件事是获得一个唯一的项目列表,然后循环该列表以添加到最终结果中

生成列表后,我们可以使用从上一个操作创建的键
count
对列表进行排序

const items=[“9777”、“9777”、“2.4”、“9777”、“2.4”、“2.4”、“9777”、“2.4”、“2.4”、“2.4”、“9777”、“9777”、“2.4”、“2.4”];
//存储结果的地方
常量结果=[];
//创建要循环的项目的唯一列表
//将每个项目添加到结果列表中
[…新集合(项目)].forEach(项目=>result.push({
关键词:项目,,
//获取当前类型的项目计数
计数:items.filter(i=>i==item).length
}));
//将数组从最高到最低排序
结果.排序((a,b)=>b.count-a.count);


控制台日志(结果)结果有多奇怪?你想要什么结果?我如何提取项目名称,然后提取项目的计数,以及如何根据计数对其进行排序听起来你想要的是一个不可排序的对象,但是,一个对象数组是可排序的。好的,你能给我一个例子吗?结果有多奇怪?你想要什么结果?我如何提取项目名称,然后提取该项目的计数,以及如何根据计数对其进行排序听起来你想要一个对象,它不是可排序的,但是,一个对象数组是可排序的。好的,你能给我一个例子吗Hello@ele谢谢你的代码,reduce工作得很好,但是,排序应该取决于reduce操作的结果。例如,如果项目“2.4”在数组中大于“9777”,那么项目“2.4”也应该是排序数组中的第一个项目及其计数。它正在工作,现在如何提取视图中的项目名称和该项目的计数。我没有计算[0]给我的{2.4:8}。如何只提取2.4,然后通过itselfHello@ele进行计数感谢代码,reduce可以完美地工作,但是排序应该基于reduce操作的结果。例如,如果项目“2.4”在数组中大于“9777”,那么项目“2.4”也应该是排序数组中的第一个项目及其计数。它正在工作,现在如何提取视图中的项目名称和该项目的计数。我没有计算[0]给我的{2.4:8}。如何只提取2.4,然后自己计数谢谢@离开我的草坪。只是想知道什么是[…新的设置,它给了我一个扭曲。这是
es6
创建唯一项目列表的方法。你的
tsconfig.json
文件必须有
target
es6
es2015
或更大。我只需要在那里更改它,我确实认为它是“target”:es5I在tsconfig.json上将其更改为es6,所有的波形都消失了,但是我在控制台上确实收到了一个编译错误。我已经上传了错误图片,请检查。谢谢@get Off My Green。只是想知道会发生什么[…新的集合,它给了我一个扭曲。这是创建唯一项目列表的
es6
方法。您的
tsconfig.json
文件必须具有
es6
es的
target