@antv/g6
Version:
graph visualization frame work
193 lines (155 loc) • 5.21 kB
JavaScript
/*
* @Author: moyee
* @Date: 2019-07-30 10:39:59
* @LastEditors: moyee
* @LastEditTime: 2019-08-20 17:04:25
* @Description: 群组数据格式转换
*/
var _require = require('lodash'),
cloneDeep = _require.cloneDeep,
groupBy = _require.groupBy,
merge = _require.merge;
module.exports = {
groupMapNodes: {},
nodeArr: [],
/**
* 扁平的数据格式转成树形
* @param {array} data 扁平结构的数据
* @param {string} value 树状结构的唯一标识
* @param {string} parentId 父节点的键值
* @return {array} 转成的树形结构数据
*/
flatToTree: function flatToTree(data, value, parentId) {
if (value === void 0) {
value = 'id';
}
if (parentId === void 0) {
parentId = 'parentId';
}
var children = 'children';
var valueMap = [];
var tree = [];
var groups = data.groups;
groups.forEach(function (v) {
valueMap[v[value]] = v;
});
groups.forEach(function (v) {
var parent = valueMap[v[parentId]];
if (parent) {
!parent[children] && (parent[children] = []);
parent[children].push(v);
} else {
tree.push(v);
}
});
return tree;
},
addNodesToParentNode: function addNodesToParentNode(originData, nodes) {
var _this = this;
var calcNodes = function calcNodes(data) {
data.forEach(function (row) {
if (row.children) {
_this.nodeArr.push({
id: row.id,
parentId: row.parentId
});
_this.addNodesToParentNode(row.children, nodes);
} else {
_this.nodeArr.push({
id: row.id,
parentId: row.parentId
});
}
});
if (_this.nodeArr.length > 0) {
var nodeMap = function nodeMap(groupIds) {
if (groupIds.length === 0) {
return;
} // const selfIds = groupIds.map(node => node.id);
// const parentIds = groupIds.map(node => node.parentId);
// const ids = new Set(selfIds);
// parentIds.forEach(pid => ids.add(pid));
var first = groupIds.shift();
var x = cloneDeep(groupIds);
_this.groupMapNodes[first.id] = x;
nodeMap(groupIds);
};
nodeMap(_this.nodeArr);
}
_this.nodeArr.length = 0;
};
calcNodes(originData);
return this.groupMapNodes;
},
/**
* 获取各个group中的节点
* @param {object} data G6的数据模型
* @return {object} 各个group中的节点
*/
getAllNodeInGroups: function getAllNodeInGroups(data) {
var groupById = groupBy(data.groups, 'id');
var groupByParentId = groupBy(data.groups, 'parentId');
var result = {};
for (var parentId in groupByParentId) {
if (!parentId) {
continue;
} // 获取当前parentId的所有子group ID
var subGroupIds = groupByParentId[parentId]; // 获取在parentid群组中的节点
var nodeInParentGroup = groupById[parentId];
if (nodeInParentGroup && subGroupIds) {
// 合并
var parentGroupNodes = [].concat(subGroupIds, nodeInParentGroup);
result[parentId] = parentGroupNodes;
} else if (subGroupIds) {
result[parentId] = subGroupIds;
}
}
var allGroupsId = merge({}, groupById, result); // 缓存所有group包括的groupID
var groupIds = {};
for (var groupId in allGroupsId) {
if (!groupId || groupId === 'undefined') {
continue;
}
var _subGroupIds = allGroupsId[groupId].map(function (node) {
return node.id;
}); // const nodesInGroup = data.nodes.filter(node => node.groupId === groupId).map(node => node.id);
groupIds[groupId] = _subGroupIds;
} // 缓存所有groupID对应的Node
var groupNodes = {};
var _loop = function _loop(_groupId) {
if (!_groupId || _groupId === 'undefined') {
return "continue";
}
var subGroupIds = groupIds[_groupId]; // const subGroupIds = allGroupsId[groupId].map(node => node.id);
// 解析所有子群组
var parentSubGroupIds = [];
for (var _iterator = subGroupIds, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var subId = _ref;
var tmpGroupId = allGroupsId[subId].map(function (node) {
return node.id;
}); // const tmpNodes = data.nodes.filter(node => node.groupId === subId).map(node => node.id);
parentSubGroupIds.push.apply(parentSubGroupIds, tmpGroupId);
}
var nodesInGroup = data.nodes.filter(function (node) {
return parentSubGroupIds.indexOf(node.groupId) > -1;
}).map(function (node) {
return node.id;
});
groupNodes[_groupId] = nodesInGroup;
};
for (var _groupId in groupIds) {
var _ret = _loop(_groupId);
if (_ret === "continue") continue;
}
return groupNodes;
}
};