在 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[""];
是什么意思。有什么想法吗?
最佳答案
对于给定的每个类,它通过父类递归返回,将类名取到最后一个 .
,将每个父类添加到映射中,最后添加一个为空的父类名称的字符串(没有点)。
这个父节点作为根,路径为空字符串,返回的就是这个节点。
我会尝试用一个例子来更好地解释;
给定一个具有完整路径 Main.Sub.Class
的类,代码会将 Main.Sub.Class
节点添加到具有该路径的映射中,然后尝试为 Main.Sub
找到/创建一个节点,并将其自身作为子节点添加到该父节点。
如果它必须为 Main.Sub
创建一个新节点,它也会尝试为这个类找到父节点,(Main
),并添加 Main.Sub
作为 Main
的子级。然后它再次继续向上,但是由于路径中没有 .
,父路径是 ""
(空字符串)。
由于所有类最终都会将自己作为子节点添加到空字符串节点,因此可以将此节点视为根节点,因此要返回的节点也是如此。
关于javascript返回映射,键为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016830/