为了账号安全,请及时绑定邮箱和手机立即绑定

获取数组中出现次数最多的元素

获取数组中出现次数最多的元素

幕布斯7119047 2019-08-08 15:11:08
获取数组中出现次数最多的元素我正在寻找一种优雅的方法来确定哪个元素在JavaScript数组中出现次数最多(模式)。例如,在['pear', 'apple', 'orange', 'apple']'apple'元素是最常见的元素。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

这只是模式。这是一个快速,非优化的解决方案。它应该是O(n)。

function mode(array){
    if(array.length == 0)
        return null;
    var modeMap = {};
    var maxEl = array[0], maxCount = 1;
    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];
        if(modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;  
        if(modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;}


查看完整回答
反对 回复 2019-08-08
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

自2009年以来,javascript已经有了一些发展 - 我想我会添加另一种选择。我不太关心效率,直到它实际上是一个问题所以我对“优雅”代码的定义(由OP规定)有利于可读性 - 这当然是主观的......

function mode(arr){
    return arr.sort((a,b) =>
          arr.filter(v => v===a).length        - arr.filter(v => v===b).length    ).pop();}mode(['pear', 'apple', 'orange', 'apple']); // apple

在这个特定的例子中,如果集合中的两个或多个元素具有相同的出现次数,那么将返回数组中最新出现的元素。同样值得指出的是,它会修改你原来的阵列 - 如果你希望Array.slice事先打电话,这可以防止 。


编辑:使用一些ES6 胖箭更新了示例,因为2015年发生了,我认为它们看起来很漂亮......如果您关注向后兼容性,可以在修订历史中找到它。


查看完整回答
反对 回复 2019-08-08
?
长风秋雁

TA贡献1757条经验 获得超7个赞

根据George Jempty's请求将算法考虑为关系,我提出了Matthew Flaschen's算法的修改版本。

function modeString(array){
    if (array.length == 0)
        return null;

    var modeMap = {},
        maxEl = array[0],
        maxCount = 1;

    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];

        if (modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;

        if (modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
        else if (modeMap[el] == maxCount)
        {
            maxEl += '&' + el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;}

现在,这将返回一个字符串,其中模式元素由'&'符号分隔。收到结果后,可以在该'&'元素上拆分,然后就可以使用您的模式。

另一个选择是返回一个模块元素数组,如下所示:

function modeArray(array){
    if (array.length == 0)
        return null;
    var modeMap = {},
        maxCount = 1, 
        modes = [];

    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];

        if (modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;

        if (modeMap[el] > maxCount)
        {
            modes = [el];
            maxCount = modeMap[el];
        }
        else if (modeMap[el] == maxCount)
        {
            modes.push(el);
            maxCount = modeMap[el];
        }
    }
    return modes;}

在上面的例子中,您将能够将函数的结果作为模式数组来处理。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 1080 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号