Итак, вот как я могу сделать это с некоторыми из новейших функций JavaScript:
Во-первых, уменьшите массив до Map
из числа:
let countMap = array.reduce(
(map, value) => {map.set(value, (map.get(value) || 0) + 1); return map},
new Map()
)
Используя Map
, ваш начальный массив может содержать объекты любого типа, и количество будет правильным.Без Map
некоторые типы объектов будут давать странные подсчеты.См. Map
документы для получения дополнительной информации о различиях.
Это также может быть сделано с объектом, если все ваши значения являются символами, числами или строками:
let countObject = array.reduce(
(map, value) => { map[value] = (map[value] || 0) + 1; return map },
{}
)
Или немного более функционально, без мутаций, используя деструктуризацию и синтаксис распространения объекта:
let countObject = array.reduce(
(value, {[value]: count = 0, ...rest}) => ({ [value]: count + 1, ...rest }),
{}
)
На данный момент вы можете использовать Map
или объект для подсчета (и картуявляется прямым итератором, в отличие от объекта), или преобразует его в два массива.
Для Map
:
countMap.forEach((count, value) => console.log(`value: ${value}, count: ${count}`)
let values = countMap.keys()
let counts = countMap.values()
Или для объекта:
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)