颜色,采用随机坐标和颜色,以去除节点和包之间的联系.我认为这样处理,能更纯粹地观察标准库包与包之间的联系.
需要一个 edges 来记录包与包之间的依赖关系.在每次遍历 Imports 时,动态写入.
需要一个 nodes 来记录包自身的一些信息,但是其 size 参数,需要计算过所有依赖关系后再填入.
使用 nodedSize 来记录每个包被依赖的次数,为了提升效率,它是一个字典Map.
/* 将原始数据,转换为图标友好的数据.
ImportPath 作为唯一 id 和 标签;
Imports 用于计算依赖关系;
节点的大小,取决于被依赖的次数;
*/
function transData(datas){
/* 存储依赖路径信息. */
let edges = []
/* 存储基础节点信息. */
let nodes = []
/* 节点尺寸.初始是1, 每被引入一次再加1. */
let nodedSize = {}
/* 尺寸单位1. */
let unitSize = 1.5
datas.map((data)=>{
let itemId = data.ImportPath
nodes.push({
"label": itemId,
"attributes": {},
"id": itemId,
"size": 1
})
if(data.Imports){
data.Imports.map((importItem)=>{
edges.push({
"sourceID": importItem,
"attributes": {},
"targetID": itemId,
"size": unitSize
})
if(nodedSize[importItem]){
nodedSize[importItem] = nodedSize[importItem] + unitSize
}else{
nodedSize[importItem] = unitSize
}
})
}
})
/* 尺寸数据合并到节点上. */
nodes.map((item)=>{
let itemId = item.id
if(nodedSize[itemId]){
item.size = nodedSize[itemId]
}
})
return {
nodes,edges
}
}
效果与源码
相关链接