array-types-counter
Version:
Simple helper to obtain the count of different array item's types.
53 lines (44 loc) • 1.08 kB
text/typescript
import {isNumber} from 'number-helper-functions';
import {orderBy} from 'lodash';
/**
* TypeCount class
*
* @class TypeCount
*/
class TypeCount {
public type: string;
public count: number;
/**
* Creates an instance of TypeCount.
* @param {string} type
* @param {number} count
* @memberof TypeCount
*/
public constructor(type: string, count: number) {
this.type = type;
this.count = count;
}
}
type CountObj = Record<string, number>;
/**
* Counts the array's item types
*
* @export
* @param {any[]} array
* @return {TypeCount[]} The array item types ordered by count, descending
*/
export function countArrayTypes(array: any[]): TypeCount[] {
const countObj: CountObj = array.reduce((agg, item) => {
let type = typeof item;
if (type === 'string' && isNumber(item)) {
type = 'number';
}
if (agg[type] == null) {
agg[type] = 1;
} else {
agg[type]++;
}
return agg;
}, {});
return orderBy(Object.entries(countObj).map(([type, count]) => new TypeCount(type, count)), 'count', 'desc');
}