@beisen/ethos
Version:
beisencloud pc react components
113 lines (83 loc) • 2.35 kB
JavaScript
;
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var hasown = require('hasown');
function copyIf(source, target) {
var hasOwn = hasown(target);
(0, _keys2.default)(source).forEach(function (key) {
if (!hasOwn(key)) {
target[key] = source[key];
}
});
}
function groupByFields(data, fields, path, names, fieldIndex) {
data = data || [];
fieldIndex = fieldIndex || 0;
var field = fields[fieldIndex];
if (!field) {
return data;
}
var group = groupArrayByField(data, field);
var fieldName = typeof field == 'string' ? field : field.name;
if (!fieldIndex) {
group.namePath = [];
group.valuePath = [];
group.depth = 0;
delete group.name;
}
var groupsCount = group.length;
if (group.keys && group.keys.length) {
group.leaf = false;
group.keys.forEach(function (key) {
var groupPath = (path || []).concat(key);
var fieldNames = (names || []).concat(fieldName);
var data = groupByFields(group.data[key], fields, groupPath, fieldNames, fieldIndex + 1);
if (Array.isArray(data)) {
data = {
data: data,
leaf: true
};
}
data.name = fieldName;
data.value = key;
data.valuePath = groupPath;
data.namePath = fieldNames;
data.depth = fieldIndex + 1;
if (typeof field != 'string') {
copyIf(field, data);
}
group.data[key] = data;
if (!data.leaf) {
groupsCount += data.groupsCount;
}
});
}
if (!group.leaf) {
group.groupsCount = groupsCount;
}
return group;
}
function groupArrayByField(data, field) {
var groupKeys = {};
var groupKeysArray = [];
var fieldName = typeof field == 'string' ? field : field.name;
(data || []).forEach(function (item) {
var itemKey = item[fieldName];
if (groupKeys[itemKey]) {
groupKeys[itemKey].push(item);
} else {
groupKeys[itemKey] = [item];
groupKeysArray.push(itemKey);
}
});
var result = {
keys: groupKeysArray,
data: groupKeys,
childName: fieldName,
length: groupKeysArray.length,
leaf: true
};
return result;
}
module.exports = groupByFields;