ice.fo.utils
Version:
48 lines (40 loc) • 1.4 kB
JavaScript
/* eslint-disable vue/max-len */
import _groupBy from 'lodash/groupBy';
import _get from 'lodash/get';
import _isEqual from 'lodash/isEqual';
import _isFunction from 'lodash/isFunction';
/**
* Group a list of objects by [key] name. The [key] also supports properties path access e.g. 'user.profile.name'
*
* @example
* groupByKey([{name: 'nikochin', age: 10}, {name: 'nikochin', age: 30}, {name: 'edward', age: 10}], 'name', true); // returns [ [{name: 'nikochin', age: 10}, {name: 'nikochin', age: 30}], [{name: 'edward', age: 10}] ]
*
* @param {any[]} list
* @param {string|string[]} key
* @param {boolean} keepOrder
* @returns An list of objects list grouped by key
*/
export default function groupByKey(list, key, keepOrder = false) {
if (!keepOrder) {
return Object.values(_groupBy(list, (i) => _get(i, key)));
}
const result = [];
const firstItem = _get(list, '0');
const isFuncKey = _isFunction(key);
let previousValue = isFuncKey ? key(firstItem) : _get(firstItem, key);
let previousList = [];
list.forEach((item) => {
const value = isFuncKey ? key(item) : _get(item, key);
if (_isEqual(value, previousValue)) {
previousList.push(item);
} else {
result.push(previousList);
previousList = [item];
previousValue = value;
}
});
if (previousList.length) {
result.push(previousList);
}
return result;
}