Get the element with the highest occurrence in an array

后端 未结 30 1240
野性不改
野性不改 2020-11-22 11:17

I\'m looking for an elegant way of determining which element has the highest occurrence (mode) in a JavaScript array.

For example, in

[\'pear\', \'a         


        
30条回答
  •  孤街浪徒
    2020-11-22 11:59

    As per George Jempty's request to have the algorithm account for ties, I propose a modified version of Matthew Flaschen's algorithm.

    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;
    }
    

    This will now return a string with the mode element(s) delimited by a & symbol. When the result is received it can be split on that & element and you have your mode(s).

    Another option would be to return an array of mode element(s) like so:

    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;
    }
    

    In the above example you would then be able to handle the result of the function as an array of modes.

提交回复
热议问题