求数组中出现次数最多的元素

103 阅读1分钟

法1: 数组去重 + 双重 for 循环 + 排序 (复杂)

  1. 选择你喜欢的一种数组去重方法,对原数组进行去重,得到一个去重后的新数组
  2. 新原数组来一个双重 for 循环,新数组的元素作为键 key,该键在原数组出现的次数 value 作为值,push 到一个新的数组对象中,得到相应元素在原数组中出现的次数
  3. 对2中得到的数组对象按 value 从大到小进行排序,得到的数组中的第一个对象对应的键 key 即是原数组中出现次数最多的元素
const getResult = (arr) => {
    // 数组去重
    let setArr = [...new Set(arr)]
    let resultArr = []
    let result = ''
    // 获取新数组 
    for (let i = 0; i < setArr.length; i++) {
        let key = setArr[i]
        let value = 0
        for (let j = 0; j < arr.length; j++) {
            if (setArr[i] === arr[j]) {
                value++
            }
        }
        resultArr.push({ key, value })
    }
    // 从大到小排序
    resultArr.sort((a, b) => {
        return b.value - a.value
    })
    // 获取结果
    result = resultArr[0].key
    return result
}

let arr = ['red', 'green', 'red', 'blue', 'blue', 'red', 'blue', 'blue','red','red']

console.log(getResult(arr));// red

法2: for 循环 + 三元 + if 判断

  1. 对原数组进行 for 循环
  2. 如果对象中找不到该键,则动态新增该键名,出现次数为1(值为1);如果对象找得到该键,则动态修改键值(加1)
  3. 打擂台:比较对象中键值与 0的大小 ,如果比 0 大,则最大的元素为对应的键,出现的次数为值
const getResult1 = (arr) => {
    let obj = {}
    let maxKey = null
    let maxValue = 0
    // 循环
    for (let i = 0; i < arr.length; i++) {
       // 为对象 动态新增键,动态修改值
        obj[arr[i]] == undefined? obj[arr[i]] = 1: obj[arr[i]]++
        // 打擂台
        if(obj[arr[i]]> maxValue){
            maxKey = arr[i]
            maxValue = obj[arr[i]]
        }
    }
    return maxKey   
}

let arr = ['red', 'green', 'red', 'blue', 'blue', 'red', 'blue', 'blue','red','red']

console.log(getResult1(arr));