문제

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