react-occult
Version:
Layered Information Visualization based on React and D3
61 lines (53 loc) • 1.45 kB
JavaScript
import { hierarchy } from 'd3-hierarchy';
function recursiveIDAccessor(idAccessor, node, accessorString) {
if (node.parent) {
accessorString = `${accessorString}-${recursiveIDAccessor(
idAccessor,
{ ...node.parent, ...node.parent.data },
accessorString
)}`;
}
return `${accessorString}-${idAccessor({ ...node, ...node.data })}`;
}
export const nodesEdgesFromHierarchy = (
baseRootNode,
idAccessor = d => d.id || d.descendantIndex
) => {
const edges = [];
const nodes = [];
const rootNode = baseRootNode.descendants
? baseRootNode
: hierarchy(baseRootNode);
const descendants = rootNode.descendants();
descendants.forEach((d, i) => {
d.descendantIndex = i;
});
descendants.forEach((node, i) => {
const generatedID = `${idAccessor({
...node,
...node.data
})}-${(node.parent &&
recursiveIDAccessor(
idAccessor,
{ ...node.parent, ...node.parent.data },
''
)) ||
'root'}`;
const dataD = Object.assign(node, node.data || {}, {
hierarchicalID: generatedID
});
nodes.push(dataD);
if (node.parent !== null) {
const dataParent = Object.assign(node.parent, node.parent.data || {});
edges.push({
source: dataParent,
target: dataD,
depth: node.depth,
weight: 1,
value: 1,
_NWFEdgeKey: generatedID
});
}
});
return { edges, nodes };
};