Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按元素出现频率对数组排序_Javascript_Arrays - Fatal编程技术网

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)外观和频率的区别是什么?你说的“有效”是什么意思?外观和频率的区别是什么?你说的“有效”是什么意思?你需要返回“结果”而不是“计数”你需要返回“结果”而不是“计数”