McKHAANNN
McKHAANNN

Reputation: 142

get most occurring elements in array JavaScript

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

Upvotes: 4

Views: 6487

Answers (3)

Alfrex92
Alfrex92

Reputation: 6768

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

Upvotes: 0

Akrion
Akrion

Reputation: 18515

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

Upvotes: 1

slider
slider

Reputation: 12990

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

Upvotes: 13

Related Questions