Counting the occurrences / frequency of array elements

前端 未结 30 2048
甜味超标
甜味超标 2020-11-21 06:47

In Javascript, I\'m trying to take an initial array of number values and count the elements inside it. Ideally, the result would be two new arrays, the first specifying each

30条回答
  •  离开以前
    2020-11-21 07:39

    So here's how I'd do it with some of the newest javascript features:

    First, reduce the array to a Map of the counts:

    let countMap = array.reduce(
      (map, value) => {map.set(value, (map.get(value) || 0) + 1); return map}, 
      new Map()
    )
    

    By using a Map, your starting array can contain any type of object, and the counts will be correct. Without a Map, some types of objects will give you strange counts. See the Map docs for more info on the differences.

    This could also be done with an object if all your values are symbols, numbers, or strings:

    let countObject = array.reduce(
      (map, value) => { map[value] = (map[value] || 0) + 1; return map },
      {}
    )
    

    Or slightly fancier in a functional way without mutation, using destructuring and object spread syntax:

    let countObject = array.reduce(
      (value, {[value]: count = 0, ...rest}) => ({ [value]: count + 1, ...rest }),
      {}
    )
    

    At this point, you can use the Map or object for your counts (and the map is directly iterable, unlike an object), or convert it to two arrays.

    For the Map:

    countMap.forEach((count, value) => console.log(`value: ${value}, count: ${count}`)
    
    let values = countMap.keys()
    let counts = countMap.values()
    

    Or for the object:

    Object
      .entries(countObject) // convert to array of [key, valueAtKey] pairs
      .forEach(([value, count]) => console.log(`value: ${value}, count: ${count}`)
    
    let values = Object.keys(countObject)
    let counts = Object.values(countObject)
    

提交回复
热议问题