繁体   English   中英

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

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

我正在寻找一种优雅的方法来确定哪个元素在 JavaScript 数组中出现次数最多( mode )。

例如,在

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

'apple'元素是最常见的元素。

这只是模式。 这是一个快速的、非优化的解决方案。 它应该是 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;
}

自 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 年发生了,我认为它们看起来很漂亮......如果您担心向后兼容性,您可以在修订历史中找到它。

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

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

根据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)

我默认为 null,如果 null 是您要过滤的一个可能选项,它并不总是会给您一个真实的响应,也许这可能是一个可选的第二个参数

与其他各种解决方案一样,缺点是它不处理“绘制状态”,但这仍然可以通过稍微复杂的 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] }
}

当我将此功能用作面试官的测验时,我发布了我的解决方案:

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))

在这里尝试一种声明性方法。 该解决方案构建了一个对象来统计每个单词的出现次数。 然后通过将每个单词的总出现次数与对象中找到的最高值进行比较,将对象过滤到一个数组中。

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

是时候换一个解决方案了:

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

如果简洁很重要(它不重要),那么:

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

如果要避免不存在的成员(例如稀疏数组),则需要额外的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

这里的其他答案将返回undefined

这是使用内置地图的现代版本(因此它不仅适用于可以转换为唯一字符串的东西):

 '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']));

这是另一种使用 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);

为了真正易于阅读、可维护的代码,我分享以下内容:

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

希望它可以帮助某人;)!

该解决方案具有 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
}

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

也可以试试这个:

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

如果出现平局,此解决方案可以返回数组的多个元素。 例如,一个数组

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

有两个模式值: 36

这是解决方案。

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

这是我对这个问题的解决方案,但使用了数字并使用了新的“设置”功能。 它的性能不是很好,但我写这篇文章确实很有趣,而且它确实支持多个最大值。

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]

顺便说一句,不要将其用于生产,这只是说明如何仅使用 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'))

这是我的解决方案:-

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

也试试吧,这不考虑浏览器版本。

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']));

请注意,当 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);

我想出了一个更短的解决方案,但它使用的是 lodash。 适用于任何数据,而不仅仅是字符串。 对于可以使用的对象:

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

这适用于字符串:

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

只需根据特定标准对数据进行分组,然后找到最大的组。

这是我的方法,所以只需使用.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));

这是我的解决方案:-

 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;

注意: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;
    }
}

我猜你有两种方法。 两者各有优势。

排序然后计数或循环并使用哈希表为您进行计数。

哈希表很好,因为一旦您完成处理,您还拥有所有不同的元素。 但是,如果您有数百万个项目,如果重复率低,哈希表最终可能会使用大量内存。 排序,然后计数方法将具有更可控的内存占用。

你可以试试这个:

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

你可以在 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" );

只需复制并粘贴到 chrome 控制台中即可运行上述代码。

此函数是每种信息类型的通用函数。 它计算元素的出现次数,然后返回具有最多出​​现元素的数组。

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

这是我的方式。 我尝试对数据进行分组。

const _ = require("underscore")

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

groupResult 应该是

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

然后找到具有最长数组的属性

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

完整的代码看起来像

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

我正在寻找一种优雅的方法来确定JavaScript数组中哪个元素的出现次数最多( mode )。

例如,在

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

'apple'元素是最常见'apple'元素。

使用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'])); 

如果两个元素具有相同的出现,它将返回它们两个。 它适用于任何类型的元素。

可以尝试 :

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

已经有很多答案,但只是想与您分享我的想法:) 不能说这个解决方案依赖于任何边缘情况,但无论如何)

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 ) ]
}

希望它会对某人有所帮助)

轻松解决!

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

循环所有元素并收集数组中每个元素的计数,这是解决方案的想法

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

您可以使用这个简单的方法来获取元素的最大数量

 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