js统计数组中出现次数最多的元素

想来想去没想出更好的解决方法。
思路就是在ana函数里先遍历一遍arr,维护一个数组newArr 用于将所有数值相同的放在数组中的同一个块内。另外一个数组unique 用于维护数值唯一,判断当前的item是否已存在于newArr中。为了方便比较对象的数值相同,将所有item均转为string类型来比较。
得到的

newArr = [[3],[2],[{a:1},{a:1}],[1]]
unique = [3,2,{a:1},1]

再通过re函数遍历newArr并提取出length最大的项及数值(们)。

let arr = [3, 2, {a: 1}, 1, {a: 1}, 1];

function ana(arr) {
    let newArr = [];
    let unique = [];
    for (let i of arr) {
        i = JSON.stringify(i);
        //如果已有数值相同的元素存在
        if (unique.includes(i)) {
            newArr[unique.indexOf(i)].push(i)
        } else {
            let arr = [];
            arr.push(i);
            unique.push(i);
            newArr.push(arr)
        }
    }
    return re(newArr)
}

function re(arr) {
    let maxCount = 0;
    let thisChar = [];
    for (let i of arr) {
        if (i.length >= maxCount) {
            maxCount = i.length;
        }
    }
    for (let i of arr) {
        if (i.length === maxCount) {
            thisChar.push(JSON.parse(i[0]));
        }
    }
    return {maxCount, thisChar}
}

console.log(ana(arr)); //{ maxCount: 2, thisChar: [ { a: 1 }, 1 ] }

欢迎补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值