2

エッジ バンドリングの例である 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[""];。何か案は?

4

1 に答える 1

2

指定されたクラスごとに、親を再帰的に処理し、クラス名を last まで取得し、.各親をマップに追加し、最後に名前に空の文字列を持つ親を追加します (ドットはありませんでした)。

この親はルートと見なされ、空の文字列のパスがあり、このノードが返されます。

例を使ってよりよく説明しようとします。

完全なパスを持つクラスを指定するとMain.Sub.Class、コードはMain.Sub.Classそのパスを持つマップにノードを追加し、ノードの検索/作成を試み、Main.Subそれ自体を子としてこの親ノードに追加します。

の新しいノードを作成する必要がある場合はMain.Sub、このクラスの親 ( ) も検索し、子として にMain追加しようとします。その後、再び上に進みますが、パスに何もないため、親パスは(空の文字列) です。Main.SubMain.""

すべてのクラスは最終的に空の文字列ノードに子として追加されるため、このノードはルート ノードと見なすことができ、返されるノードも同様です。

于 2014-06-03T14:17:53.373 に答える