UNPKG

ice.fo.utils

Version:

48 lines (40 loc) 1.4 kB
/* 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; }