Classics:
Count number of each entry in an array.
I.e. someFunc(['a', 'b', 5, 'a', 2, 5])
should result in
{
2: 1,
5: 2,
'a': 2,
'b': 1
}
So, we've got const arr = ['a', 'b', 5, 'a', 2, 5]
as input.
arr.reduce((acc,e) => { acc[e] = 1 + acc[e] || 1; return acc}, {})`
// { '2': 1, '5': 2, 'a': 2, 'b': 1 }
Effect of comma operator: last expression is returned as a result.
arr.reduce((acc,e) => ( acc[e] = 1 + acc[e] || 1, acc), {})
// { '2': 1, '5': 2, 'a': 2, 'b': 1 }
Notice that numeric entries remain numeric.
arr.reduce((acc, e) => acc.set(e, 1 + (acc.get(e) || 0)), new Map());
// Map { 'a' => 2, 'b' => 1, 5 => 2, 2 => 1 }
Better in performance vs side effects.
let counts = {};
arr.forEach(e => {
counts[e] = 1 + counts[e] || 1;
});
counts
// { '2': 1, '5': 2, 'a': 2, 'b': 1 }
Easter egg: transpose matrix