计算JavaScript数组元素的出现次数并放入新的2d数组

计算JavaScript数组元素的出现次数并放入新的2d数组,javascript,arrays,Javascript,Arrays,嗨,我有一个这样的数组 var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; 我的目标是计算唯一的值,并有一个关于它的任何项目的报告,这样结果就很好了 Array [ [5, 3], [2, 5], [9, 1], [4, 1] ] 我找到了一个解决方案,可以在另一篇文章中找到 [ @Emissary解决方案对我来说是最好的,问题是这个解决方案需要重新考虑并添加一些我不需要的新功能,我不能直接回复那篇帖子来询问如何只拥有我需要的数组:D @使

嗨,我有一个这样的数组

var a = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
我的目标是计算唯一的值,并有一个关于它的任何项目的报告,这样结果就很好了

Array [
   [5, 3],
   [2, 5],
   [9, 1],
   [4, 1]
]
我找到了一个解决方案,可以在另一篇文章中找到 [

@Emissary解决方案对我来说是最好的,问题是这个解决方案需要重新考虑并添加一些我不需要的新功能,我不能直接回复那篇帖子来询问如何只拥有我需要的数组:D

@使者添加

console.log(键+':'+val)

我的第一个想法是,取而代之的是console.log,我可以在2d数组中推送每个值,但我认为这不是一个好主意,因为如果我已经很好地理解了@Emissary解决方案,那么解决方案的第一部分就是创建我需要的数组


知道如何“隔离”这个特定数组吗?

您可以使用
forEach()
循环来实现这一点

var a=[5,5,5,2,2,2,2,2,9,4];
var结果=[]
a、 forEach(函数(e){
如果(!此[e]){
这个[e]=[e,0];
结果。推送(此[e])
}
本[e][1]++
}, {})

log(result)
只需将其从
映射中拉出

var a=[5,5,5,2,2,2,2,2,9,4];
var aCount=[…新集合(a)].map(
x=>[x,a.filter(y=>y==x).length]
);
控制台日志(aCount);

这是使用
映射的理想情况,因为它通过键进行标识,但在对其进行强制转换时也会变成该类型的数组:

var a=[5,5,5,2,2,2,2,2,9,4];
var result=[…a.reduce((m,v)=>m.set(v,(m.get(v)| | 0)+1),newmap());
log(result);
您可以将与的解决方案一起使用,以获得具有所需结果的数组

var a=[5,5,5,2,2,2,2,2,9,4];
var aCount=[…新映射([…新集合(a)].Map(
x=>[x,a.filter(y=>y==x).length]
))];
console.log(aCount);
您可以使用ES6的映射来完成它,并使用array.from将其转换回数组

Map类似于hash,它维护一个键值对。与其遍历每个元素并维护一个计数,不如创建一个Map并设置每次出现的计数,然后将其转换为一个数组,这在es6中很容易实现

检查此代码段

var a=[5,5,5,2,2,2,2,2,9,4];
var myMap2=新映射();
a、 forEach(函数(num){
if(myMap2.has(num)){
var count=myMap2.get(num);
myMap2.set(num,count+1);
}否则
myMap2.set(num,1);
});
var arr=Array.from(myMap2);

console.log(arr);
这里有很好的解决方案,但为了多样性,您最好在整理结果时执行以下操作

var a=[5,5,5,2,2,2,2,2,9,4],
事物=a.reduce((p,c)=>(p[c]?p[c]+:p[c]=1,p),[]))
.reduce((p,c,i)=>c?(p.push([i,c]),p):p,[]);

console.log(thing);
有趣的是,当与
map
组合以转换输出列时,当评估文本(通常是一袋单词)中的单词出现率/频率数组时,
reduce
spread syntax
解决方案也非常有效:

var r,words=“我们不再说话\n我们不再说话\n我们不再说话\n像过去那样\n我们不再爱\n这一切是为了什么?\n不,我们不再说话\n像过去那样\n\n我刚听说你找到了你一直在找的人\n你一直在找的人”
words=words.split(/['\s]+/g);
r=[…words.reduce((m,v)=>m.set(v,((m.get(v)| | 0)+1)),new Map())].Map(e=>[e[0],e[1]/words.length])

console.log(r)
使用
reduce
是性能方面最好的解决方案。Tnx似乎很快,我只注意到它使用了spread语法,我使用的是旧的浏览器Iceweasel,我不知道是否可以工作。目前,仅在windows中的节点上测试,不适用于spread Sintax。您需要哪些支持?ES3、ES5?您是否支持
Map
?所以你认为排列操作是O(1)…以我的经验
[…thingy]
是一个非常慢的操作。Tnx,我不知道这将在哪个浏览器上运行,因为现在我正在节点上本地测试代码。您的第二个解决方案在节点上工作,但不返回2d数组,只返回普通数组。我想我将用一个try代码实现这两个解决方案。目标是有一个非常快的方法,因为数据非常大。Tnx,t他的解决方案不使用扩展语法,在我的情况下更好,因为我需要授予最好的兼容性