js如何找出数组中重复最多的元素

如下array中 js如何找出数组中重复最多的元素(尽量用es6以上的语法,简洁点)

let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '李'];

补充: 2018-7-17 10:42:53
其实我最开始是用mockjs做的一个关于数组的练习, 现在这个问题就是func10的需求部分, demo=>
https://codepen.io/vizocn/pen...

func10现在还未完成, 想请教各位看有没有更好更简洁的方法解决.
初始数组数据结构如下图
图片描述

阅读 12.6k
7 个回答
const d = {};
let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '李'];
ary.forEach(k => !d[k] ? d[k] = 1 : d[k]++);
const max = Object.keys(d).sort((a, b) => d[b] - d[a])[0];
console.log(max)

不算定义变量的话就2行 够简洁了吧

const d = {};
let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '周', '李'];
ary.forEach(k => !d[k] ? d[k] = 1 : d[k]++);
const result = Object.keys(d).sort((a, b) => d[b] - d[a]).filter((k, i, l) => d[k] === d[l[0]]);
console.log(result)

更新了一下 result 是现在是数组结果 最长数量一样的值都会列出。

如果只取最大值还是建议使用hfhan那种方式,比较正统,我这算 奇技淫巧 代码看起来短其实多了2次循环,不过如果你有把重复数量从大到小排序的需求倒是可以用用

function search(arr){
    var maxCount = 0,
        maxItem = '',
        obj = {}
    arr.forEach(function(item){
        obj[item] ? (obj[item].count += 1) : obj[item] = {count: 1}
        obj[item].count > maxCount && (maxCount = obj[item].count, maxItem = item)
    })
    //return {item:maxItem,count:maxCount}
    return maxItem
}

更新了一下最多可能有多个的情况

let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '李']
let dary = Array.from(new Set(ary))
let s = JSON.stringify(ary)
let maxStr = dary.reduce((res, val) => {
  let count = s.match(new RegExp(`"${val}"`, 'g')).length
  return count >= res[0].count ? [{val, count},...res] : [...res,{val, count}]
}, [{count: 0}])
maxStr = maxStr.filter(val => (val.count === maxStr[0].count))
console.log(maxStr)

另外借鉴了hfhan的写法

let maxCount = 0
let maxStr = ary.reduce((res, val) => {
    res[val] = res[val] ? ++res[val] : 1
    maxCount = res[val] > maxCount ? res[val] : maxCount
    return res
}, {})
maxStr = Object.entries(maxStr).filter(val => val[1] === maxCount)
console.log(maxStr)

hfhan 的答案很高效,不过对这个问题只能找出第一个达到最多的情况,如果有多个同样最多不好说啊!我在此基础上改写了一个,支持多个最多情况

function search(arr){
    var maxCount = 0,
        maxItem = '',
        obj = {}
    arr.forEach(function(item){
        obj[item] ? (obj[item].count += 1) : obj[item] = {count: 1}
        obj[item].count > maxCount && (maxCount = obj[item].count, maxItem = item)
        obj[item].count == maxCount && (maxItem = maxItem+','+item)
    })
    //return {item:maxItem,count:maxCount}
    return maxItem
}
      let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '李'];
      let arr = []
      for(var i = 0; i< ary.length; i++) {
        if(arr.indexOf(ary[i]) === -1) {
          arr.push(ary[i])
        }
      }
新手上路,请多包涵

const sortArray = new Set(['赵', '钱', '孙', '孙', '李', '周', '李', '周', '李']);

新手上路,请多包涵
  // 用map实现的最多可能有多个的情况
  // 找出数组里重复次数最多的元素
  function findMaxRepeatedElement(arr) {
    if (!Array.isArray(arr)) {
      return;
    }
    if (arr.length === 1) {
      return arr[1];
    }
    // 找出重复最多元素的次数 并把元素和重复次数存入map
    const map = new Map();
    const maxCount = arr.reduce((maxCount, item) => {
      map.set(item, map.get(item) ? map.get(item) + 1 : 1);
      return map.get(item) > maxCount ? map.get(item) : maxCount;
    }, 0);
    // 找出重复最多的元素和重复的次数
    return [...map].filter((item) => item[1] && item[1] === maxCount);
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题