在想一个js算法,如何算出数组所有项的出现次数

比如 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次。

各位大佬有什么思路吗?

如果您有思路,可以给小弟来个评论,实现方法多多益善~~~
阅读 764
评论 2018-12-04 提问
    7 个回答
    ars_qu
    • 1.6k

    第一种 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);
    }  
    评论 赞赏 2018-12-04

      初始化空对象,遍历数组,把数组成员设置为对象的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 }))
      评论 赞赏 2018-12-04

        arr.reduce((p, k) => (p[k]++ || (p[k] = 1), p), {})

        评论 赞赏 2018-12-04

          可以用对象的来保存如

             let countObj = {};
             const arr = [1, 2, 3, 1, 5, 8, 2, 9, 9, 2, 2, 2, 3];
          
             arr.forEach( item => {
              if (countObj[item] !== undefined) {
                 console.log('aa')
                 countObj[item]++;
              } else {
                 countObj[item] = 0;
              }
             })
          
             console.log(countObj)

          这个 countObj 的key 就是你数组的数字, value 就是对应 的次数

          评论 赞赏 2018-12-04
            var arr = [1, 2, 3, 1, 5, 8, 2, 9, 9, 2, 2, 2, 3];
            var tempArr = Array.from(new Set(arr)); // 去重
            var countArray = tempArr.map(function(item){
                var count = arr.filter(function(arrItem){return item == arrItem});
                return {
                    value: item,
                    count: count.length || 0
                };
            });

            当然我这种比较简单..只支持数字或字符串

            评论 赞赏 2018-12-04
              var arr = [1, 2, 3, 1, 5, 8, 2, 9, 9, 2, 2, 2, 3];
              var newArr = Array.from(new Set(arr));
              var obj = [];
              for(var i =0 ;i<newArr.length;i++){
                  obj.push("{"+newArr[i]+":"+( arr.toString().split(newArr[i]).length-1)+"}")
              }
              //思路:去重,然后 split 每个数字出现的次数。
              评论 赞赏 2018-12-04
                Kenya
                • 26
                var ret = arr.reduce(function(obj,val){    
                    if(obj[val] != undefined){
                        obj[val] = obj[val] + 1;
                    }else{
                        obj[val] = 1;
                    }
                    return obj;
                },{});
                评论 赞赏 2018-12-04
                  撰写回答

                  登录后参与交流、获取后续更新提醒