function filterNetwork(
network,
{
nodeId = (d) => d.id,
byNodes = null,
byLinks = null,
edgelessNodes = false,
nodesMap,
egoDistance = 1,
egoPoint5 = true
} = {}
) {
nodesMap = nodesMap
? nodesMap
: new Map(network.nodes.map((d, i, all) => [nodeId(d, i, all), d]));
let res = {
nodes: [...network.nodes],
links: [...network.links]
};
function filterNodesFromLinks(res) {
const ids = [...new Set(res.links.map((l) => [l.source, l.target]).flat())];
res.nodes = ids.map((id) => nodesMap.get(id)).filter((d) => d);
return res;
}
function filterLinksFromNodes({ nodes, links }, { filterBoth = true } = {}) {
const ids = new Set(nodes.map(nodeId));
let filteredLinks = links;
links = links
.filter(({ source, target }) =>
filterBoth
? ids.has(source) && ids.has(target)
: ids.has(source) || ids.has(target)
)
.map((l) => ({ ...l }));
return { nodes, links };
}
if (byNodes) {
res.nodes = res.nodes.filter(byNodes).map((n) => ({ ...n }));
}
res = filterLinksFromNodes(res, { filterBoth: true });
if (byLinks) {
res.links = res.links.filter(byLinks).map((l) => ({
...l
}));
if (!edgelessNodes) {
res = filterNodesFromLinks(res, { filterBoth: true });
}
}
if (egoPoint5) {
res = filterLinksFromNodes(
{ nodes: res.nodes, links: network.links },
{ filterBoth: true }
);
res = filterNodesFromLinks(res, { filterBoth: true });
}
for (
let currentDistance = 1;
currentDistance < egoDistance;
currentDistance += 1
) {
res = filterLinksFromNodes(
{ nodes: res.nodes, links: network.links },
{ filterBoth: false }
);
res = filterNodesFromLinks(res, { filterBoth: true });
if (egoPoint5) {
res = filterLinksFromNodes(
{ nodes: res.nodes, links: network.links },
{ filterBoth: true }
);
res = filterNodesFromLinks(res, { filterBoth: true });
}
}
return res;
}