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

时间:2018-11-27 23:45:49

标签: javascript arrays frequency

我有一个数组,希望得到最多出现的元素,

  

第一种情况

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

3 个答案:

答案 0 :(得分:3)

您可以使用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);

答案 1 :(得分:1)

您可以为每个值计算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']))

答案 2 :(得分:0)

您还可以使用for of循环和ìn

例如

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