1
比如 var arr = [1, 2, 3, 1, 5, 8, 2, 9, 9, 2, 2, 2, 3];

如何才能能够算出,数组中有几种值,以及某种值出现的次数呢?

比如这个题答案就是:  
数组中出现的元素值为:1, 2, 3, 5, 8, 9这几个。
其中1出现次数为2次,2出现次数为5次,3出现次数为2次,5出现次数为1次,8出现次数为1次,9出现次数为2次。

各位大佬有什么思路吗?

如果您有思路,可以给小弟来个评论,实现方法多多益善~~~
张金金 265
2018-12-04 提问

查看全部 7 个回答

5

初始化空对象,遍历数组,把数组成员设置为对象的key,初始value为0,然后每找到一个key++

arr.reduce((prev, curr) => {
  prev[curr] = prev[curr] || 0
  prev[curr]++
  return prev
}, {})

数组去重,得到唯一的成员,然后遍历,返回每个成员在原数组中的个数

[...new Set(arr)].map(a => ({ [a]: arr.filter(_a => _a === a).length }))

推荐答案

1

已采纳

第一种 obj 记录出现次数

var obj = {};
for(var i=0;i<arr.length;i++)
 obj[arr[i]] = !obj[arr[i]]?1:++obj[arr[i]];

第二种 indexOf

var cache=[],obj={};
 for(var i=0;i<arr.length;i++)
   cache.indexOf(arr[i])==-1?(obj[arr[i]]=1,cache.push(arr[i])):obj[arr[i]]++

第三种 正则查找

var obj = {},idx=[];
for(var i=0,str = arr.join(',');i<arr.length;i++)
  !obj[arr[i]]&&(patch(arr[i],str),obj[arr[i]]=1);
function patch(re,s){
   re=new RegExp(re,"ig");
   idx.push(s.match(re).length);
}  

推广链接