Javascript D3.js强制布局:显示任意节点的根路径

Javascript D3.js强制布局:显示任意节点的根路径,javascript,d3.js,Javascript,D3.js,我正在使用d3.js的force布局,我需要在图中显示根目录的路径。点击“任务10”节点,它会显示路径(任务10->任务6->任务4->任务1)。根目录将被识别为相同的源和目标,但此信息我只传递数据。我的数据包含具有节点路径信息的“根路径”,如“任务10”根路径为[“任务6”、“任务4”、“任务1”] 我完整的图形代码可以在这里看到 我正在写下面的方法,以便在单击特定节点时,它将显示根路径。但目前它只显示1个节点。我不知道如何迭代所有其他节点列表 function rootPath(d){

我正在使用d3.js的force布局,我需要在图中显示根目录的路径。点击“任务10”节点,它会显示路径(任务10->任务6->任务4->任务1)。根目录将被识别为相同的源和目标,但此信息我只传递数据。我的数据包含具有节点路径信息的“根路径”,如“任务10”根路径为[“任务6”、“任务4”、“任务1”]

我完整的图形代码可以在这里看到

我正在写下面的方法,以便在单击特定节点时,它将显示根路径。但目前它只显示1个节点。我不知道如何迭代所有其他节点列表

  function rootPath(d){
    var curNodeDetail = d.details.RootPath;
    var source=[],target=[],i=0,j=0;
    source[i] = d.name;
    target[i] = curNodeDetail[i];
    links.style("stroke-opacity", function(o) {
            if(source[i] === o.source.name && target[i] === o.target.name){
                source[i+1] = curNodeDetail[i];
                target[i+1] = curNodeDetail[i+1];
                i++;
                return  1;      
            }
            else    
                return 0.1;     
        })
        .attr("marker-end", function(o){
                if(source[j] === o.source.name && target[j] === o.target.name){
                        j++;
                        return "url(#arrowhead)";
                }
                else
                    return "url(#arrowhead2)";
        });
  }

将d.details.rootpath转换为d3.set并添加当前节点,然后询问每个链接,查看两端是否都是该集合的一部分

这适用于链接,但对于节点-->


}以下功能可能有用:-

function rootPath(d){
    var curNodeDetail = d.details.RootPath;
    var rootMap = rootPathItinerary(d.name,curNodeDetail);
    links.style("stroke-opacity", function(o) {
            return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? 1 : 0.1;
    })
    .attr("marker-end", function(o){
            return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? "url(#arrowhead)" : "url(#arrowhead2)";
    });
}

function rootPathItinerary(node,rootPathDet){
    var i=0;
    var map = d3.map();
    map.set(node,rootPathDet[i]);//10,6
    while(i+1 <rootPathDet.length){ //6,4,1
            map.set(rootPathDet[i],rootPathDet[i+1]) ; //6,4 ; 4,1
            i++;
    }
    return map;
}
函数根路径(d){
var curNodeDetail=d.details.RootPath;
var rootMap=rootpathcinerary(d.name,curNodeDetail);
样式(“笔划不透明度”,函数(o){
return(rootMap.has(o.source.name)&&(rootMap.get(o.source.name)==o.target.name))?1:0.1;
})
.attr(“标记结束”,功能(o){
return(rootMap.has(o.source.name)&(rootMap.get(o.source.name)==o.target.name))?“url(#arrowhead)”:“url(#arrowhead2)”;
});
}
函数rootPathCinerary(节点,rootPathDet){
var i=0;
var map=d3.map();
set(node,rootPathDet[i]);//10,6

而(i+1)我认为map(键值对)对于查询每个链接都很有用。在map中,我将把源作为键插入,把目标作为值插入。让我们为任务10取一个ex,我将插入(“任务10”,“任务6”,“任务4”,“任务1”),每个链接都将在map中签入。我不知道如何使用d3.map()实现这一点…我会搜索它。谢谢你,我已经实现了:)
function rootPath(d){
    var curNodeDetail = d.details.RootPath;
    var rootMap = rootPathItinerary(d.name,curNodeDetail);
    links.style("stroke-opacity", function(o) {
            return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? 1 : 0.1;
    })
    .attr("marker-end", function(o){
            return (rootMap.has(o.source.name) && (rootMap.get(o.source.name) === o.target.name)) ? "url(#arrowhead)" : "url(#arrowhead2)";
    });
}

function rootPathItinerary(node,rootPathDet){
    var i=0;
    var map = d3.map();
    map.set(node,rootPathDet[i]);//10,6
    while(i+1 <rootPathDet.length){ //6,4,1
            map.set(rootPathDet[i],rootPathDet[i+1]) ; //6,4 ; 4,1
            i++;
    }
    return map;
}