4

I have an array that I want to get the most occurring elements,

First scenario

let arr1 = ['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz']
let newArr = someFunc(arr1)

so in this case I want the new array to have the value

console.log(newArr) // ['foo', 'bar'] 

Because the value 'foo' and 'bar' was the most occurring element of the array

Second scenario

 let arr2 = ['foo', 'foo', 'foo', 'bar', 'baz']
 let newArr = someFunc(arr2)

so in this case I want the new array to have the value

console.log(newArr) // ['foo']

Because the value 'foo' was the most occurring element of the array

This is what I have tried and it will only get me one of the elements even if there are more than one element that occurs the same amount of times

newArr= arr.sort((a,b) =>
arr.filter(v => v===a).length
- arr.filter(v => v===b).length
).pop()
McKHAANNN
  • 142
  • 2
  • 10
  • 2
    How do you define "most frequent"? More than 2 occurrences or top *n*? What code have you tried that you're stuck on? – ggorlen Nov 27 '18 at 23:47
  • 1
    Show us your attempt to implement it – Eriks Klotins Nov 27 '18 at 23:48
  • I mean that i want the top _n_ of the array, it can be a single element or more if multiple element is _n_ @gg – McKHAANNN Nov 27 '18 at 23:50
  • 1
    Your question is unclear. 1) Please paraphrase your question to define what is your definition for "frequent elements" | 2) Show us what you've tried. – TechnoCorner Nov 27 '18 at 23:52
  • 1
    if you just need a concept: throw the elements as keys into an object and increase their respectable value by one on each collision – GottZ Nov 27 '18 at 23:53
  • Do you realize sort is called multiple times per index? So that would be very inefficient. – epascarello Nov 27 '18 at 23:59
  • https://stackoverflow.com/questions/48435191/counting-item-frequency-in-an-array-javascript or https://stackoverflow.com/questions/3579486/sort-a-javascript-array-by-frequency-and-then-filter-repeats or https://stackoverflow.com/questions/31227687/find-the-most-frequent-item-of-an-array-not-just-strings?noredirect=1 or many others? – epascarello Nov 28 '18 at 00:02
  • The question is now updated @TechnoCorner – McKHAANNN Nov 28 '18 at 00:05
  • That is why I need your help @epascarello – McKHAANNN Nov 28 '18 at 00:06
  • Did you check this https://stackoverflow.com/questions/1053843/get-the-element-with-the-highest-occurrence-in-an-array – TechnoCorner Nov 28 '18 at 00:07
  • yes I did, I only returns one of the elements if I have more than one element that occurs the most times @TechnoCorner – McKHAANNN Nov 28 '18 at 00:12

3 Answers3

12

You can count the items with reduce and find the maximum occurring count. Then you can filter any keys that have that count:

let arr = ['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz'];

let counts = arr.reduce((a, c) => {
  a[c] = (a[c] || 0) + 1;
  return a;
}, {});
let maxCount = Math.max(...Object.values(counts));
let mostFrequent = Object.keys(counts).filter(k => counts[k] === maxCount);

console.log(mostFrequent);
slider
  • 12,810
  • 1
  • 26
  • 42
1

You can calculate the max for each of the values and only return those which match via grouping them with an Array.reduce:

const mostFrequent = data => data.reduce((r,c,i,a) => {
  r[c] = (r[c] || 0) + 1
  r.max = r[c] > r.max ? r[c] : r.max
  if(i == a.length-1) {
    r = Object.entries(r).filter(([k,v]) => v == r.max && k != 'max')
    return r.map(x => x[0])
  }
  return r
}, {max: 0})

console.log(mostFrequent(['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz']))
console.log(mostFrequent(['foo', 'foo', 'foo', 'bar', 'baz']))
Akrion
  • 18,117
  • 1
  • 34
  • 54
0

You can also use a for ofloop and ìn

For example

const arrayFrecuent = [3, 1, 2, 1, 3, 2, 5, 4, 2, 10];

const mostFrecuent = givenArray => {
  let counts = {};
  let maxValue = -1;
  let maxItem = null;
  for (const num of givenArray) {
    if (!(num in counts)) {
      counts[num] = 1;
    } else {
      counts[num] = counts[num] + 1;
    }
    if (counts[num] > maxValue) {
      maxValue = counts[num];
      maxItem = num;
    }
  }
  return maxItem;
};

const mostFrecuentNumber = mostFrecuent(arrayFrecuent);

console.log("mostFrecuentNumber", mostFrecuentNumber);
Alfrex92
  • 6,278
  • 9
  • 31
  • 51