UNPKG

@antv/f2

Version:

Charts for mobile visualization.

67 lines 1.92 kB
import { required } from "./accessors.js"; import { Node, computeHeight } from "./hierarchy/index.js"; var preroot = { depth: -1 }, ambiguous = {}; function defaultId(d) { return d.id; } function defaultParentId(d) { return d.parentId; } export default function () { var id = defaultId, parentId = defaultParentId; function stratify(data) { var nodes = Array.from(data), n = nodes.length, d, i, root, parent, node, nodeId, nodeKey, nodeByKey = new Map(); for (i = 0; i < n; ++i) { d = nodes[i], node = nodes[i] = new Node(d); if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { nodeKey = node.id = nodeId; nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); } if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { node.parent = nodeId; } } for (i = 0; i < n; ++i) { node = nodes[i]; if (nodeId = node.parent) { parent = nodeByKey.get(nodeId); if (!parent) throw new Error("missing: " + nodeId); if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); if (parent.children) parent.children.push(node);else parent.children = [node]; node.parent = parent; } else { if (root) throw new Error("multiple roots"); root = node; } } if (!root) throw new Error("no root"); root.parent = preroot; root.eachBefore(function (node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); root.parent = null; if (n > 0) throw new Error("cycle"); return root; } stratify.id = function (x) { return arguments.length ? (id = required(x), stratify) : id; }; stratify.parentId = function (x) { return arguments.length ? (parentId = required(x), stratify) : parentId; }; return stratify; }