简体   繁体   English

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

[英]Get the element with the highest occurrence in an array

I'm looking for an elegant way of determining which element has the highest occurrence ( mode ) in a JavaScript array.我正在寻找一种优雅的方法来确定哪个元素在 JavaScript 数组中出现次数最多( mode )。

For example, in例如,在

['pear', 'apple', 'orange', 'apple']

the 'apple' element is the most frequent one. 'apple'元素是最常见的元素。

This is just the mode.这只是模式。 Here's a quick, non-optimized solution.这是一个快速的、非优化的解决方案。 It should be O(n).它应该是 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;
}

There have been some developments in javascript since 2009 - I thought I'd add another option.自 2009 年以来,javascript 有了一些发展——我想我会添加另一个选项。 I'm less concerned with efficiency until it's actually a problem so my definition of "elegant" code (as stipulated by the OP) favours readability - which is of course subjective...我不太关心效率,直到它实际上是一个问题,所以我对“优雅”代码的定义(由 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

In this particular example, should two or more elements of the set have equal occurrences then the one that appears latest in the array will be returned.在此特定示例中,如果集合中的两个或多个元素具有相同的出现次数,则将返回在数组中出现最新的元素。 It's also worth pointing out that it will modify your original array - which can be prevented if you wish with an Array.slice call beforehand.还值得指出的是,它会修改您的原始数组 - 如果您希望事先使用Array.slice调用,可以防止这种情况发生。


Edit: updated the example with some ES6 fat arrows because 2015 happened and I think they look pretty... If you are concerned with backwards compatibility you can find this in the revision history .编辑:用一些ES6 粗箭头更新了示例,因为2015 年发生了,我认为它们看起来很漂亮......如果您担心向后兼容性,您可以在修订历史中找到它。

As per George Jempty's request to have the algorithm account for ties, I propose a modified version of Matthew Flaschen's algorithm.根据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;
}

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.在上面的示例中,您将能够将函数的结果作为模式数组处理。

Based on Emissary 's ES6+ answer, you could use Array.prototype.reduce to do your comparison (as opposed to sorting, popping and potentially mutating your array), which I think looks quite slick.根据Emissary的 ES6+ 回答,您可以使用Array.prototype.reduce进行比较(而不是排序、弹出和可能改变您的数组),我认为这看起来很巧妙。

const mode = (myArray) =>
  myArray.reduce(
    (a,b,i,arr)=>
     (arr.filter(v=>v===a).length>=arr.filter(v=>v===b).length?a:b),
    null)

I'm defaulting to null, which won't always give you a truthful response if null is a possible option you're filtering for, maybe that could be an optional second argument我默认为 null,如果 null 是您要过滤的一个可能选项,它并不总是会给您一个真实的响应,也许这可能是一个可选的第二个参数

The downside, as with various other solutions, is that it doesn't handle 'draw states', but this could still be achieved with a slightly more involved reduce function.与其他各种解决方案一样,缺点是它不处理“绘制状态”,但这仍然可以通过稍微复杂的 reduce 函数来实现。

a=['pear', 'apple', 'orange', 'apple'];
b={};
max='', maxi=0;
for(let k of a) {
  if(b[k]) b[k]++; else b[k]=1;
  if(maxi < b[k]) { max=k; maxi=b[k] }
}

As I'm using this function as a quiz for the interviewers, I post my solution:当我将此功能用作面试官的测验时,我发布了我的解决方案:

const highest = arr => (arr || []).reduce( ( acc, el ) => {
  acc.k[el] = acc.k[el] ? acc.k[el] + 1 : 1
  acc.max = acc.max ? acc.max < acc.k[el] ? el : acc.max : el
  return acc  
}, { k:{} }).max

const test = [0,1,2,3,4,2,3,1,0,3,2,2,2,3,3,2]
console.log(highest(test))

Trying out a declarative approach here.在这里尝试一种声明性方法。 This solution builds an object to tally up the occurrences of each word.该解决方案构建了一个对象来统计每个单词的出现次数。 Then filters the object down to an array by comparing the total occurrences of each word to the highest value found in the object.然后通过将每个单词的总出现次数与对象中找到的最高值进行比较,将对象过滤到一个数组中。

const arr = ['hello', 'world', 'hello', 'again'];

const tally = (acc, x) => { 

  if (! acc[x]) { 
    acc[x] = 1;
    return acc;
  } 

  acc[x] += 1;
  return acc;
};

const totals = arr.reduce(tally, {});

const keys = Object.keys(totals);

const values = keys.map(x => totals[x]);

const results = keys.filter(x => totals[x] === Math.max(...values));

Time for another solution:是时候换一个解决方案了:

function getMaxOccurrence(arr) {
    var o = {}, maxCount = 0, maxValue, m;
    for (var i=0, iLen=arr.length; i<iLen; i++) {
        m = arr[i];

        if (!o.hasOwnProperty(m)) {
            o[m] = 0;
        }
        ++o[m];

        if (o[m] > maxCount) {
            maxCount = o[m];
            maxValue = m;
        }
    }
    return maxValue;
}

If brevity matters (it doesn't), then:如果简洁很重要(它不重要),那么:

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        m = a[i];
        o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
        if (o[m] > mC) mC = o[m], mV = m;
    }
    return mV;
}

If non–existent members are to be avoided (eg sparse array), an additional hasOwnProperty test is required:如果要避免不存在的成员(例如稀疏数组),则需要额外的hasOwnProperty测试:

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        if (a.hasOwnProperty(i)) {
            m = a[i];
            o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
            if (o[m] > mC) mC = o[m], mV = m;
        }
    }
    return mV;
}

getMaxOccurrence([,,,,,1,1]); // 1

Other answers here will return undefined .这里的其他答案将返回undefined

Here's the modern version using built-in maps (so it works on more than things that can be converted to unique strings):这是使用内置地图的现代版本(因此它不仅适用于可以转换为唯一字符串的东西):

 'use strict'; const histogram = iterable => { const result = new Map(); for (const x of iterable) { result.set(x, (result.get(x) || 0) + 1); } return result; }; const mostCommon = iterable => { let maxCount = 0; let maxKey; for (const [key, count] of histogram(iterable)) { if (count > maxCount) { maxCount = count; maxKey = key; } } return maxKey; }; console.log(mostCommon(['pear', 'apple', 'orange', 'apple']));

Here is another ES6 way of doing it with O(n) complexity这是另一种使用 O(n) 复杂度的 ES6 方法

const result = Object.entries(
    ['pear', 'apple', 'orange', 'apple'].reduce((previous, current) => {
        if (previous[current] === undefined) previous[current] = 1;
        else previous[current]++;
        return previous;
    }, {})).reduce((previous, current) => (current[1] >= previous[1] ? current : previous))[0];
console.log("Max value : " + result);

For the sake of really easy to read, maintainable code I share this:为了真正易于阅读、可维护的代码,我分享以下内容:

function getMaxOcurrences(arr = []) {
  let item = arr[0];
  let ocurrencesMap = {};

  for (let i in arr) {
    const current = arr[i];

    if (ocurrencesMap[current]) ocurrencesMap[current]++;
    else ocurrencesMap[current] = 1;

    if (ocurrencesMap[item] < ocurrencesMap[current]) item = current;
  }

  return { 
    item: item, 
    ocurrences: ocurrencesMap[item]
  };
}

Hope it helps someone ;)!希望它可以帮助某人;)!

This solution has O(n) complexity该解决方案具有 O(n) 复杂度

function findhighestOccurenceAndNum(a){
    let obj={};
    let maxNum;
    let maxVal;
    for(let v of a){
        obj[v]= ++obj[v] ||1;
        if(maxVal === undefined || obj[v]> maxVal){
            maxNum= v;
            maxVal=obj[v];
        }
    }
    console.log(maxNum + 'has max value = ', maxVal);
}
function mode(arr){
  return arr.reduce(function(counts,key){
    var curCount = (counts[key+''] || 0) + 1;
    counts[key+''] = curCount;
    if (curCount > counts.max) { counts.max = curCount; counts.mode = key; }
    return counts;
  }, {max:0, mode: null}).mode
}

Another JS solution from: https://www.w3resource.com/javascript-exercises/javascript-array-exercise-8.php另一个 JS 解决方案来自: https ://www.w3resource.com/javascript-exercises/javascript-array-exercise-8.php

Can try this too:也可以试试这个:

let arr =['pear', 'apple', 'orange', 'apple'];

function findMostFrequent(arr) {
  let mf = 1;
  let m = 0;
  let item;

  for (let i = 0; i < arr.length; i++) {
    for (let j = i; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        m++;
        if (m > mf) {
          mf = m;
          item = arr[i];
        }
      }
    }
    m = 0;
  }

  return item;
}

findMostFrequent(arr); // apple
var array = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17],
    c = {}, // counters
    s = []; // sortable array

for (var i=0; i<array.length; i++) {
    c[array[i]] = c[array[i]] || 0; // initialize
    c[array[i]]++;
} // count occurrences

for (var key in c) {
    s.push([key, c[key]])
} // build sortable array from counters

s.sort(function(a, b) {return b[1]-a[1];});

var firstMode = s[0][0];
console.log(firstMode);

This solution can return multiple elements of an array in case of a tie.如果出现平局,此解决方案可以返回数组的多个元素。 For example, an array例如,一个数组

arr = [ 3, 4, 3, 6, 4, ];

has two mode values: 3 and 6 .有两个模式值: 36

Here is the solution.这是解决方案。

function find_mode(arr) {
    var max = 0;
    var maxarr = [];
    var counter = [];
    var maxarr = [];

    arr.forEach(function(){
       counter.push(0);
    });

    for(var i = 0;i<arr.length;i++){
       for(var j=0;j<arr.length;j++){
            if(arr[i]==arr[j])counter[i]++; 
       }
    } 


    max=this.arrayMax(counter);   
  
    for(var i = 0;i<arr.length;i++){
         if(counter[i]==max)maxarr.push(arr[i]);
    }

    var unique = maxarr.filter( this.onlyUnique );
    return unique;

  };


function arrayMax(arr) {
      var len = arr.length, max = -Infinity;
      while (len--) {
              if (arr[len] > max) {
              max = arr[len];
              }
      }
  return max;
 };

 function onlyUnique(value, index, self) {
       return self.indexOf(value) === index;
 }

Here is my solution to this problem but with numbers and using the new 'Set' feature.这是我对这个问题的解决方案,但使用了数字并使用了新的“设置”功能。 Its not very performant but i definitely had a lot of fun writing this and it does support multiple maximum values.它的性能不是很好,但我写这篇文章确实很有趣,而且它确实支持多个最大值。

const mode = (arr) => [...new Set(arr)]
  .map((value) => [value, arr.filter((v) => v === value).length])
  .sort((a,b) => a[1]-b[1])
  .reverse()
  .filter((value, i, a) => a.indexOf(value) === i)
  .filter((v, i, a) => v[1] === a[0][1])
  .map((v) => v[0])

mode([1,2,3,3]) // [3]
mode([1,1,1,1,2,2,2,2,3,3,3]) // [1,2]

By the way do not use this for production this is just an illustration of how you can solve it with ES6 and Array functions only.顺便说一句,不要将其用于生产,这只是说明如何仅使用 ES6 和 Array 函数来解决它。

const mode = (str) => {
  return str
    .split(' ')
    .reduce((data, key) => {
      let counter = data.map[key] + 1 || 1
      data.map[key] = counter

      if (counter > data.counter) {
        data.counter = counter
        data.mode = key
      }

      return data
    }, {
      counter: 0,
      mode: null,
      map: {}
    })
    .mode
}

console.log(mode('the t-rex is the greatest of them all'))

Here is my solution :-这是我的解决方案:-

 function frequent(number){ var count = 0; var sortedNumber = number.sort(); var start = number[0], item; for(var i = 0 ; i < sortedNumber.length; i++){ if(start === sortedNumber[i] || sortedNumber[i] === sortedNumber[i+1]){ item = sortedNumber[i] } } return item } console.log( frequent(['pear', 'apple', 'orange', 'apple']))

function mode(array){
    var set = Array.from(new Set(array));
    var counts = set.map(a=>array.filter(b=>b==a).length);
    var indices = counts.map((a,b)=>Math.max(...counts)===a?b:0).filter(b=>b!==0);
    var mode = indices.map(a=>set[a]);
    return mode;
}

Try it too, this does not take in account browser version.也试试吧,这不考虑浏览器版本。

function mode(arr){
var a = [],b = 0,occurrence;
    for(var i = 0; i < arr.length;i++){
    if(a[arr[i]] != undefined){
        a[arr[i]]++;
    }else{
        a[arr[i]] = 1;
    }
    }
    for(var key in a){
    if(a[key] > b){
        b = a[key];
        occurrence = key;
    }
    }
return occurrence;
}
alert(mode(['segunda','terça','terca','segunda','terça','segunda']));

Please note that this function returns latest occurence in the array when 2 or more entries appear same number of times!请注意,当 2 个或更多条目出现相同次数时,此函数返回数组中的最新出现!

// O(n)
var arr = [1, 2, 3, 2, 3, 3, 5, 6];
var duplicates = {};
max = '';
maxi = 0;
arr.forEach((el) => {
    duplicates[el] = duplicates[el] + 1 || 1;
  if (maxi < duplicates[el]) {
    max = el;
    maxi = duplicates[el];
  }
});
console.log(max);

I came up with a shorter solution, but it's using lodash.我想出了一个更短的解决方案,但它使用的是 lodash。 Works with any data, not just strings.适用于任何数据,而不仅仅是字符串。 For objects can be used:对于可以使用的对象:

const mostFrequent = _.maxBy(Object.values(_.groupBy(inputArr, el => el.someUniqueProp)), arr => arr.length)[0];

This is for strings:这适用于字符串:

const mostFrequent = _.maxBy(Object.values(_.groupBy(inputArr, el => el)), arr => arr.length)[0];

Just grouping data under a certain criteria, then finding the largest group.只需根据特定标准对数据进行分组,然后找到最大的组。

Here is my way to do it so just using .filter .这是我的方法,所以只需使用.filter

 var arr = ['pear', 'apple', 'orange', 'apple']; function dup(arrr) { let max = { item: 0, count: 0 }; for (let i = 0; i < arrr.length; i++) { let arrOccurences = arrr.filter(item => { return item === arrr[i] }).length; if (arrOccurences > max.count) { max = { item: arrr[i], count: arrr.filter(item => { return item === arrr[i] }).length }; } } return max.item; } console.log(dup(arr));

Here is my solution :-这是我的解决方案:-

 const arr = [ 2, 1, 10, 7, 10, 3, 10, 8, 7, 3, 10, 5, 4, 6, 7, 9, 2, 2, 2, 6, 3, 7, 6, 9, 8, 9, 10, 8, 8, 8, 4, 1, 9, 3, 4, 5, 8, 1, 9, 3, 2, 8, 1, 9, 6, 3, 9, 2, 3, 5, 3, 2, 7, 2, 5, 4, 5, 5, 8, 4, 6, 3, 9, 2, 3, 3, 10, 3, 3, 1, 4, 5, 4, 1, 5, 9, 6, 2, 3, 10, 9, 4, 3, 4, 5, 7, 2, 7, 2, 9, 8, 1, 8, 3, 3, 3, 3, 1, 1, 3, ]; function max(arr) { let newObj = {}; arr.forEach((d, i) => { if (newObj[d] != undefined) { ++newObj[d]; } else { newObj[d] = 0; } }); let nwres = {}; for (let maxItem in newObj) { if (newObj[maxItem] == Math.max(...Object.values(newObj))) { nwres[maxItem] = newObj[maxItem]; } } return nwres; } console.log(max(arr));

    const frequence = (array) =>
      array.reduce(
        (acc, item) =>
          array.filter((v) => v === acc).length >=
          array.filter((v) => v === item).length
            ? acc
            : item,
        null
      );
frequence([1, 1, 2])
var mode = 0;
var c = 0;
var num = new Array();
var value = 0;
var greatest = 0;
var ct = 0;

Note: ct is the length of the array.注意:ct 是数组的长度。

function getMode()
{
    for (var i = 0; i < ct; i++)
    {
        value = num[i];
        if (i != ct)
        {
            while (value == num[i + 1])
            {
                c = c + 1;
                i = i + 1;
            }
        }
        if (c > greatest)
        {
            greatest = c;
            mode = value;
        }
        c = 0;
    }
}

I guess you have two approaches.我猜你有两种方法。 Both of which have advantages.两者各有优势。

Sort then Count or Loop through and use a hash table to do the counting for you.排序然后计数或循环并使用哈希表为您进行计数。

The hashtable is nice because once you are done processing you also have all the distinct elements.哈希表很好,因为一旦您完成处理,您还拥有所有不同的元素。 If you had millions of items though, the hash table could end up using a lot of memory if the duplication rate is low.但是,如果您有数百万个项目,如果重复率低,哈希表最终可能会使用大量内存。 The sort, then count approach would have a much more controllable memory footprint.排序,然后计数方法将具有更可控的内存占用。

You can try this:你可以试试这个:

 // using splice()   
 // get the element with the highest occurence in an array
    function mc(a) {
      var us = [], l;
      // find all the unique elements in the array
      a.forEach(function (v) {
        if (us.indexOf(v) === -1) {
          us.push(v);
        }
      });
      l = us.length;
      while (true) {
        for (var i = 0; i < l; i ++) {
          if (a.indexOf(us[i]) === -1) {
            continue;
          } else if (a.indexOf(us[i]) != -1 && a.length > 1) {
            // just delete it once at a time
            a.splice(a.indexOf(us[i]), 1);
          } else {
            // default to last one
            return a[0];
          }
        }
      }
    }

// using string.match method
function su(a) {
    var s = a.join(),
            uelms = [],
            r = {},
            l,
            i,
            m;

    a.forEach(function (v) {
        if (uelms.indexOf(v) === -1) {
            uelms.push(v);
        }
    });

    l = uelms.length;

    // use match to calculate occurance times
    for (i = 0; i < l; i ++) {
        r[uelms[i]] = s.match(new RegExp(uelms[i], 'g')).length;
    }

    m = uelms[0];
    for (var p in r) {
        if (r[p] > r[m]) {
            m = p;
        } else {
            continue;
        }
    }

    return m;
}

You could solve it in O(n) complexity你可以在 O(n) 复杂度中解决它

var arr = [1,3,54,56,6,6,1,6];
var obj = {};

/* first convert the array in to object with unique elements and number of times each element is repeated */
for(var i = 0; i < arr.length; i++)
{
   var x = arr[i];
   if(!obj[x])
     obj[x] = 1;
   else 
     obj[x]++;
}

console.log(obj);//just for reference

/* now traverse the object to get the element */
var index = 0;
var max = 0;

for(var obIndex in obj)
{
  if(obj[obIndex] > max)
  {
    max = obj[obIndex];
    index = obIndex;
  }
}
console.log(index+" got maximum time repeated, with "+ max +" times" );

Just copy and paste in chrome console to run the above code.只需复制并粘贴到 chrome 控制台中即可运行上述代码。

This function is generic function for every type of info.此函数是每种信息类型的通用函数。 It counts the occurrence of the elements and then returns array with maximum occurring elements.它计算元素的出现次数,然后返回具有最多出​​现元素的数组。

function mode () {
  var arr = [].slice.call(arguments);
  if ((args.length == 1) && (typeof args[0] === "object")) {
    args = args[0].mode();
  }

  var obj = {};
  for(var i = 0; i < arr.length; i++) {
    if(obj[arr[i]] === undefined) obj[arr[i]] = 1;
    else obj[arr[i]]++;
  }

  var max = 0;
  for (w in obj) {
    if (obj[w] > max) max = obj[w];
  }

  ret_val = [];
  for (w in obj) {
    if (obj[w] == max) ret_val.push(w);
  }

  return ret_val;
}
function mode(){
  var input = $("input").val().split(",");
  var mode = [];
  var m = [];
  var p = [];
    for(var x = 0;x< input.length;x++){
      if(m.indexOf(input[x])==-1){
        m[m.length]=input[x];
    }}
  for(var x = 0; x< m.length;x++){
    p[x]=0;
    for(var y = 0; y<input.length;y++){
      if(input[y]==m[x]){
      p[x]++; 
 }}}
 for(var x = 0;x< p.length;x++){
   if(p[x] ==(Math.max.apply(null, p))){
     mode.push(m[x]);
 }} 
$("#output").text(mode);}

Here is my way.这是我的方式。 I try to group data fist.我尝试对数据进行分组。

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult = _.groupBy(test, (e)=> e);

The groupResult should be groupResult 应该是

{
  1: [1, 1, 1]
  2: [2] 
}

Then find the property which has the longest array然后找到具有最长数组的属性

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

The complete code looks like完整的代码看起来像

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult= _.groupBy(test, (e)=> e);
console.log(findMax(groupResult)[0].value);

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

I'm looking for an elegant way of determining which element has the highest occurrence ( mode ) in a JavaScript array.我正在寻找一种优雅的方法来确定JavaScript数组中哪个元素的出现次数最多( mode )。

For example, in例如,在

['pear', 'apple', 'orange', 'apple']

the 'apple' element is the most frequent one. 'apple'元素是最常见'apple'元素。

With ES6, you can chain the method like this: 使用ES6,您可以像这样链接方法:

  function findMostFrequent(arr) { return arr .reduce((acc, cur, ind, arr) => { if (arr.indexOf(cur) === ind) { return [...acc, [cur, 1]]; } else { acc[acc.indexOf(acc.find(e => e[0] === cur))] = [ cur, acc[acc.indexOf(acc.find(e => e[0] === cur))][1] + 1 ]; return acc; } }, []) .sort((a, b) => b[1] - a[1]) .filter((cur, ind, arr) => cur[1] === arr[0][1]) .map(cur => cur[0]); } console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple'])); console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple', 'pear'])); 

If two elements have the same occurrence, it will return both of them. 如果两个元素具有相同的出现,它将返回它们两个。 And it works with any type of element. 它适用于任何类型的元素。

Can try :可以尝试 :

var arr = [10,3,4,5,3,4,3,8,3,6,3,5,1];
var temp = {};

for(let i=0;i<arr.length;i++){
    if(temp[arr[i]]==undefined){
       temp[arr[i]]=1;
    }else{
        temp[arr[i]]+=1;
    }
}

var max=0, maxEle;

for(const i in temp){
    if(temp[i]>max){
        max = temp[i];
        maxEle=i;
    }
}

console.log(`most occurred element is ${maxEle} and number of times is ${max}`);`

There are a lot of answers already but just want to share with you what I came up with :) Can't say this solution counts on any edge case but anyway )已经有很多答案,但只是想与您分享我的想法:) 不能说这个解决方案依赖于任何边缘情况,但无论如何)

const getMostFrequentElement = ( arr ) => {
  const counterSymbolKey = 'counter'
  const mostFrequentSymbolKey = 'mostFrequentKey'

  const result = arr.reduce( ( acc, cur ) => {
    acc[ cur ] = acc[ cur ] ? acc[ cur ] + 1 : 1

    if ( acc[ cur ] > acc[ Symbol.for( counterSymbolKey ) ] ) {
      acc[ Symbol.for( mostFrequentSymbolKey ) ] = cur
      acc[ Symbol.for( counterSymbolKey ) ] = acc[ cur ]
    }

    return acc
  }, {
    [ Symbol.for( mostFrequentSymbolKey ) ]: null,
    [ Symbol.for( counterSymbolKey ) ]: 0
  } )

  return result[ Symbol.for( mostFrequentSymbolKey ) ]
}

Hope it will be helpful for someone )希望它会对某人有所帮助)

Easy solution !轻松解决!

 function mostFrequentElement(arr) { let res = []; for (let x of arr) { let count = 0; for (let i of arr) { if (i == x) { count++; } } res.push(count); } return arr[res.indexOf(Math.max(...res))]; } array = [13 , 2 , 1 , 2 , 10 , 2 , 1 , 1 , 2 , 2]; let frequentElement = mostFrequentElement(array); console.log(`The frequent element in ${array} is ${frequentElement}`);

Loop on all element and collect the Count of each element in the array that is the idea of the solution循环所有元素并收集数组中每个元素的计数,这是解决方案的想法

 //const arr = [1, 2, 4, 3, 5, 1, 2, 3, 3]; const arr = ['pear', 'apple', 'orange', 'apple']; // init max occurance element let maxOcc = {'element': null, occured: 0}; // to find occurances const res = arr.reduce((acc, el) => { acc[el] = acc[el] ? acc[el]+1 : 1; if(acc[el]> maxOcc.occured){ maxOcc = { 'element': el, occured: acc[el] }; } return acc; }, {}); console.log(maxOcc);

function getData(arr){
  let obj = {}
  let maxElementCount = 0
  let maxEle = ''
  for(let i = 0 ;i<arr.length;i++){
    if(!obj[arr[i]]){
        obj[arr[i]] = 1
    }else{
        obj[arr[i]] += 1
      if(maxElementCount < obj[arr[i]]){
        maxElementCount = obj[arr[i]]
        maxEle = arr[i]
      }
    }
  }
  console.log(maxElementCount, maxEle)
  return obj
}

You can use this simple method to get max count of element您可以使用这个简单的方法来获取元素的最大数量

 const data = ['x','y','x','z',5,2,4,5,2,3,2,'x', { x: 1 }, (x) => x]; function getModeData(data) { return data.reduce((a,c) => { if(typeof a[c] === "undefined") { a[c] = 1; } else { a[c]++; } if( typeof a.mode === "undefined" || (typeof a.mode.== "undefined") && a.mode.occurrences < a[c] ) { a:mode = { elem, c: occurrences; a[c] } } return a, }: { mode; undefined }): } const { mode, { elem, occurrences }. ..;totals } = getModeData(data). console;log(`The mode is ${elem} with ${occurrences} occurrences`). console:log('The totals are;'). console.log(totals)

function findMode(arr = []) {
  return (arr.reduce((p, c) => {
    if (!p.mode[c]) p.mode[c] = 0;

    p.mode[c]++;

    if (p.count < p.mode[c]) {
      p.max = c;
      p.count = p.mode[c];
    }

    return p;
  }, { mode: {}, max: null, count: 0 })).max;
}
function mostReapetdNum(array){
let j = 0;
let temp = array[j];
let num = 0;
let count = 0;
for(let i=1; i<=array.length -1; i++){
    if(array[i] === temp){
        count++;
    }
}
if(num<count){
        num = count;
    }
    j++;
return array[j];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM