Javascript 按元素出现频率对数组排序
我正在寻找一种有效的解决方案,根据元素出现的次数对数组进行排序 例如:Javascript 按元素出现频率对数组排序,javascript,arrays,Javascript,Arrays,我正在寻找一种有效的解决方案,根据元素出现的次数对数组进行排序 例如: let values = ["10", "4", "4", "4", "7", "7"] 我认为最好的输出应该是[{number,frequency},…],在本例中如下所示: [{4, 3}, {7, 2}, {10, 1}] 我已经看到了很多方法,但是每个解决方案都只是根据频率对数组进行排序,而不需要访问元素出现的次数 目前,我只有从另一个StackOverflow主题获得的代码(不记得是哪一个,抱歉) var
let values = ["10", "4", "4", "4", "7", "7"]
我认为最好的输出应该是[{number,frequency},…]
,在本例中如下所示:
[{4, 3}, {7, 2}, {10, 1}]
我已经看到了很多方法,但是每个解决方案都只是根据频率对数组进行排序,而不需要访问元素出现的次数 目前,我只有从另一个StackOverflow主题获得的代码(不记得是哪一个,抱歉)
var map=values.reduce(函数(p,c){
p[c]=(p[c]| | 0)+1;
返回p;
}, {});
var newTypesArray=Object.keys(map).sort(函数a,b){
返回映射[a]
它在根据频率进行排序方面做得很好,但我无法访问元素重复了多少次。我不知道怎么做。。。
有什么想法吗?
const arr=[1,1,1,2,2,3];
//使用reduce。
const result=arr.reduce((结果,项目)=>{
常数计数=结果[项目];
如果(计数==未定义){
结果[项目]=1;
}否则{
结果[项目]+=1;
}
返回结果;
}, {});
//您将得到与此类似的结果:{[item]:[count]}
//然后可以将其转换为条目数组:
const entries=Object.entries(结果);
//条目为[[项目,计数],…];
//然后分类
const sorted=entries.sort((entryA,entryB)=>entryA[1]-entryB[1]);
//将按计数对数组进行升序排序。
控制台日志(已排序)代码>
const arr=[1,1,1,2,2,3];
//使用reduce。
const result=arr.reduce((结果,项目)=>{
常数计数=结果[项目];
如果(计数==未定义){
结果[项目]=1;
}否则{
结果[项目]+=1;
}
返回结果;
}, {});
//您将得到与此类似的结果:{[item]:[count]}
//然后可以将其转换为条目数组:
const entries=Object.entries(结果);
//条目为[[项目,计数],…];
//然后分类
const sorted=entries.sort((entryA,entryB)=>entryA[1]-entryB[1]);
//将按计数对数组进行升序排序。
控制台日志(已排序)代码>像这样的东西可能会起作用:
const data=[“10”、“7”、“5”、“4”、“4”、“7”、“7”、“4”、“5”、“4”];
const result=data.reduce((r,c)=>(r[c]=(r[c]| | 0)+1,r),{});
var keys=Object.keys(result).sort((a,b)=>result[b]-result[a]);//排序键
console.log(keys.map(k=>k+':'+结果[k]);//按键排序的输出类似这样的东西可能会起作用:
const data=[“10”、“7”、“5”、“4”、“4”、“7”、“7”、“4”、“5”、“4”];
const result=data.reduce((r,c)=>(r[c]=(r[c]| | 0)+1,r),{});
var keys=Object.keys(result).sort((a,b)=>result[b]-result[a]);//排序键
console.log(keys.map(k=>k+':'+结果[k]);//输出,按键排序
我认为最好的输出应该是[{number,frequency},…]
实际上,这些对象在输出数组中是无效的JavaScript对象
,如果要将它们成对显示,可以使用数组
的数组
代替,结果如下:
[[number, frequency], ...]
在您的代码中,您就快到了,但您只需映射第一次reduce
调用的结果即可获得所需的对:
let value=[“10”、“4”、“4”、“4”、“7”、“7”];
var映射=值。减少(函数(p,c){
p[c]=(p[c]| | 0)+1;
返回p;
}, {});
var newTypesArray=Object.keys(map).map(函数(k){
返回[+k,映射[k]];
}).sort((a,b)=>b[1]-a[1]);
console.log(newTypesArray)代码>
我认为最好的输出应该是[{number,frequency},…]
实际上,这些对象在输出数组中是无效的JavaScript对象
,如果要将它们成对显示,可以使用数组
的数组
代替,结果如下:
[[number, frequency], ...]
在您的代码中,您就快到了,但您只需映射第一次reduce
调用的结果即可获得所需的对:
let value=[“10”、“4”、“4”、“4”、“7”、“7”];
var映射=值。减少(函数(p,c){
p[c]=(p[c]| | 0)+1;
返回p;
}, {});
var newTypesArray=Object.keys(map).map(函数(k){
返回[+k,映射[k]];
}).sort((a,b)=>b[1]-a[1]);
console.log(newTypesArray)
您可以对从reduce
获得的对象使用Object.entries()
,现在对键值对数组进行排序,最后映射到{number,frequency}
数组:
let value=[“10”、“4”、“4”、“4”、“7”、“7”]
var map=Object.entries(values.reduce)(函数(p,c){
p[c]=(p[c]| | 0)+1;
返回p;
}, {}))
.sort((a,b)=>a[1]({[a[0]]:a[1]}));
控制台日志(map)
您可以对从reduce
获得的对象使用Object.entries()
,现在对键值对数组进行排序,最后映射到{number,frequency}
数组:
let value=[“10”、“4”、“4”、“4”、“7”、“7”]
var map=Object.entries(values.reduce)(函数(p,c){
p[c]=(p[c]| | 0)+1;
返回p;
}, {}))
.sort((a,b)=>a[1]({[a[0]]:a[1]}));
控制台日志(map)代码>外观和频率的区别是什么?你说的“有效”是什么意思?外观和频率的区别是什么?你说的“有效”是什么意思?你需要返回“结果”而不是“计数”你需要返回“结果”而不是“计数”