получить наиболее встречающиеся элементы в массиве JavaScript - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть массив, для которого я хочу получить наиболее встречающиеся элементы,

Первый сценарий

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

, поэтому в этом случае я хочу, чтобы новый массивимеют значение

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

Поскольку значения 'foo' и 'bar' были наиболее часто встречающимися элементами массива

Второй сценарий

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

поэтому в этом случае я хочу, чтобы новый массив имел значение

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

Поскольку значение 'foo' было самым встречающимся элементом массива

Это то, что у меня естьпопробовал, и он получит только один из элементов, даже если есть несколько элементов, которые встречаются одинаковое количество раз

newArr= arr.sort((a,b) =>
arr.filter(v => v===a).length
- arr.filter(v => v===b).length
).pop()

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Вы можете вычислить max для каждого из значений и вернуть только те из них, которые совпадают, сгруппировав их с 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']))
0 голосов
/ 28 ноября 2018

Вы можете сосчитать предметы с помощью reduce и найти максимальное число встречающихся.Затем вы можете отфильтровать любые ключи с таким количеством:

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