graph = {
for (let n of dData.values()) {
n.degree = 0;
}
const linksArray = links.objects();
for (let l of linksArray) {
const source = dData.get(l.source);
source.cluster = l.target;
source.degree += 1;
}
const getOrCreateNode = (name) => {
let node = dConnections.get(name);
if (!node) {
node = {
name,
type: "Connection",
cluster: name,
x: width / 2 + (Math.random() * width) / 10,
y: height / 2 + (Math.random() * height) / 10
};
dConnections.set(name, node);
}
return node;
};
const filteredLinks = linksArray.map((l) => {
return {
source: dData.get(l.source),
target: getOrCreateNode(l.target)
};
});
const filteredNodesObject = filteredLinks.reduce(
(p, l) => {
if (!p.set.has(l.source.name)) {
p.set.add(l.source.name);
p.list.push(l.source);
}
if (!p.set.has(l.target.name)) {
p.set.add(l.target.name);
p.list.push(l.target);
}
return p;
},
{ set: new Set(), list: [] }
);
const clusters = d3.rollups(
filteredLinks,
(v) => v.map((l) => l.source).concat([v[0].target]),
(d) => d.target.name
);
return {
nodes: filteredNodesObject.list,
links: linksArray,
clusters: clusters
};
}