【问题标题】:javascript return map with key as empty stringjavascript返回地图,键为空字符串
【发布时间】:2014-06-03 13:44:58
【问题描述】:

在 D3,edge bundling example,我们有这个代码

// 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[""]; 是什么意思。有什么想法吗?

【问题讨论】:

    标签: javascript d3.js bundle-layout


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 额外问题:) 'children' 是保留关键字还是我可以用任何东西替换它?
    • Erm.. 从我所看到的如何使用它,我认为它必须被称为'children',因为根被传递给d3.layout.cluster(),我认为它期望有@987654335 @ 每个节点上的属性。不过不完全确定,我以前从未看过 d3..
    • 但是,进一步看,我在文档中看到了这一点; github.com/mbostock/d3/wiki/Cluster-Layout#children。我认为这应该允许您覆盖从给定节点检索子节点的函数,该函数必须在 cluster 变量上调用。因此,将cluster 变量的定义更改为这样的; pastebin.com/rC6ry0nC 允许您将 children 属性重命名为 offspring
    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多