JS-寻找数组中的众数

969 阅读2分钟

方案一

使用一个对象来记录值出现的次数,再对该对象处理,找出次数最多的一项

//"prop"是值,"num"是出现次数
var arr3 = [2, 3, 4, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 5, 2, 5, 2, 5, 3, 2, 3, 4]
var obj = {}//统计值出现的次数{1:次数,2:次数,3:次数...}
var obj2 = {}//最终结果,prop是数组中的值,num出现的次数的记录
for (item in arr3) {
    if (obj[arr3[item]] == undefined) {//第一次出现的值,计数为1
        obj[arr3[item]] = 1
    } else {
        obj[arr3[item]]++
    }
}
console.log(obj)//{1: 2, 2: 5, 3: 12, 4: 2, 5: 3}

//从obj1的初步结果中比较出最终结果{prop: "3", num: 12}
for (item in obj) {
    if (obj2["prop"] == undefined) {//第一次向obj2中填值
        obj2["prop"] = item
        obj2["num"] = obj[item]
    } else {
        if (obj2["num"] < obj[item]) {//比较次数,将次数大的项赋值到obj2
            obj2["prop"] = item
            obj2["num"] = obj[item]
        }
    }
    console.log(obj2)
    // {prop: "1", num: 2}
    // {prop: "2", num: 5}
    // {prop: "3", num: 12}
    // {prop: "3", num: 12}
    // {prop: "3", num: 12}
}

方案二

使用数组方法filter:1.每次删除掉第一次出现的新数字,如(1,2,3,2,3,3,3)会删除掉(1,2,3)变为(2,3,3,3);2.循环操作,直到数组内只有一种值,如(3,3),停止操作

硬用filter的,复杂了,且没有记录每种值出现的次数,改变了原数组,老脸一红

var arr3 = [2, 3, 4, 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 5, 2, 5, 2, 5, 3, 2, 3, 4]
var flag = false//用于判断数组内只有一种值
var flagcount = 0//计数组内有几种不同的值

while (!flag) {
    flagcount = 0//新一轮循环,计数清0
    if (arr3.length == 1) {//如果数组长度为1了,直接跳出
        break;
    }
    //生成过滤后的数组,操作如下
    //对flag的说明:每次新的一圈循环开始,flag设置为true,当发现数组中包含不同大小的值,则设为false,预示着还会进入下一次循环
    arr3 = arr3.filter((ele, index, self) => {
        if (flagcount == 0) {//因为第一次进入设置flag为true
            flag = true
        }
        if (flagcount >= 2) {//通过flagcount发现数组中包含不同大小的值,则设为false
            flag = false
        }
        if (self.indexOf(ele) != index) {
            return true
        } else {//累计数组中有多少种值
            flagcount++;
            return false
        }
    })
    console.log(arr3)
}

/**
输出结果
(19) [3, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 5, 2, 5, 3, 2, 3, 4]
(14) [3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 3, 2, 3]
(11) [3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3]
(9) [3, 3, 3, 3, 3, 3, 3, 2, 3]
(7) [3, 3, 3, 3, 3, 3, 3]
(6) [3, 3, 3, 3, 3, 3]
*/