What am I trying to do: Given an array of numbers, for example:
["1", "2", "1", "1", "2", "2", "3"]
, I want to find the element that is most repeated in the array. But, I also want to know if there is more than 1 element that satisfies the requirement, and what are those elements.I couldn't think of any idea on how to start with this yet...
Asked
Active
Viewed 51 times
-8

Hán
- 1
- 3
-
See [Get the element with the highest occurrence in an array](/a/38940041/4642212). Get familiar with [how to access and process objects, arrays, or JSON](/q/11922383/4642212), and use the static and instance methods of [`Object`](//developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object#Static_methods) and [`Array`](//developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array#Static_methods). Also, what you’re looking for is called the [mode](//en.wikipedia.org/wiki/Mode_%28statistics%29). – Sebastian Simon Jan 23 '23 at 15:32
1 Answers
-1
This is an approach using Array.reduce()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
- First I determine for each unique value in the array how many times it does occur, by returning an object like
{"1": 3, "2": 3, "3": 1}
- Then I determine which are the values occurred most of the times
in the array, by returning an object like
{"count": 3, "values": ["1", "2"]}
const data = ["1", "2", "1", "1", "2", "2", "3"];
//returns the number of time each unique value occurs in the array
const counts = data.reduce( (counts, item) => {
if(item in counts)
counts[item] += 1;
else
counts[item] = 1;
return counts;
}, {});
console.log(counts);
/*
{
"1": 3,
"2": 3,
"3": 1
}
*/
//returns which values and how many times occur the most
const max = Object.entries(counts)
.reduce((max, [value, count])=> {
if(count < max.count)
return max;
if(count == max.count){
max.values.push(value);
return max;
}
return {count: count, values: [value]};
},{count: 0, values: []});
console.log(max);
/*
{
"count": 3,
"values": [
"1",
"2"
]
}
*/

Diego D
- 6,156
- 2
- 17
- 30