在 D3 中, 边缘捆绑示例, ,我们有这个代码

// Lazily construct the package hierarchy from class names.
function packageHierarchy(classes) {
  var map = {};

  function find(name, data) {
    var node = map[name], i;
    if (!node) {
      node = map[name] = data || {name: name, children: []};
      if (name.length) {
        node.parent = find(name.substring(0, i = name.lastIndexOf(".")));
        node.parent.children.push(node);
        node.key = name.substring(i + 1);
      }
    }
    return node;
  }

  classes.forEach(function(d) {
    find(d.name, d);
  });

  return map[""];
}

我不明白什么 return map[""]; 方法。有任何想法吗?

有帮助吗?

解决方案

对于给出的每个类,它都会通过父类递归地返回,将类名一直到最后一个 ., ,将每个父级添加到地图中,最后添加一个名称为空字符串的父级(没有点)。

这个父节点被视为根节点,有一个空字符串路径,这个节点就是返回的。

我会尝试用一个例子来更好地解释;

给定一个具有完整路径的类 Main.Sub.Class, ,代码将添加 Main.Sub.Class 节点到具有该路径的地图,然后尝试查找/创建一个节点 Main.Sub, ,并将其自身作为子节点添加到该父节点。

如果必须创建一个新节点 Main.Sub, ,它也会尝试找到这个类的父类,(Main),并添加 Main.Sub 作为一个孩子 Main. 。然后它再次继续上升,但由于没有 . 在路径中,父路径是 "" (空字符串)。

由于所有类最终都会将自己作为子节点添加到空字符串节点,因此该节点可以被视为根节点,要返回的节点也是如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top