Javascript 如何查找相邻节点&;所有选定节点的边?D3

Javascript 如何查找相邻节点&;所有选定节点的边?D3,javascript,algorithm,d3.js,nearest-neighbor,Javascript,Algorithm,D3.js,Nearest Neighbor,我有一个力定向图,可以双击一个节点,只显示该节点和它的邻居,其余的则显示一个隐藏类->visiblity:hidden 但这只适用于一个节点。我能够选择多个节点并为它们提供selectedNode类 现在我希望在所有节点上使用这个相邻算法,并使用selectedNode类。这样,所有选定的节点和连接它们的边仍将显示,而未选定的节点和边将隐藏 以下是我如何显示/隐藏边缘。同样,这只适用于一个节点d3。我尝试了d=d3.selectAll(“selectedNode”).data()但没有运气:(

我有一个力定向图,可以双击一个节点,只显示该节点和它的邻居,其余的则显示一个隐藏类->visiblity:hidden

但这只适用于一个节点。我能够选择多个节点并为它们提供selectedNode类

现在我希望在所有节点上使用这个相邻算法,并使用selectedNode类。这样,所有选定的节点和连接它们的边仍将显示,而未选定的节点和边将隐藏

以下是我如何显示/隐藏边缘。同样,这只适用于一个节点
d3。我尝试了
d=d3.selectAll(“selectedNode”).data()但没有运气:(


我认为这里有两个问题,由于你缺乏细节,我将做出假设

1) 有一种方法可以检查两个节点是否是邻居。这是一个良好的开端,但还不够,您还需要一种方法来告诉您任何给定节点是选定节点还是其邻居之一。假设您在一个数组
selected
中维护一个所选节点的列表,在一个简单的实现中,这样的函数是什么样子的:

function shouldBeVisible(nodeIndex){
    // visible if either selected itself or neighbour of a selected node
    return selected.some(function(d){
        // assuming you don't care about the direction of your edges
        return linkedByIndex[nodeIndex+','+d]+linkedByIndex[d+','+nodeIndex];
    });
}
您甚至可以重载此方法以使其“边缘友好”:

请注意,如果不在数据结构中维护所选节点,则应该能够使用
d3.selectAll('.selectedNode')
检索它们,而无需花费太多精力。您可能希望为边实现类似的方法

2) 你只是在检查附近的情况,而不是在检查。无论哪种方式,只要
链接准确地描述了它所指的内容,就不必费心这么做

请尝试以下方法:

links.classed("hidden", function(d) {
    return !shouldBeVisible(d.source.index, d.target.index);
});

您能提供一个带有baerbone实现的JSFIDLE吗?现在还不清楚这个
在这个范围内指的是什么。请看这里是一些基础知识,因为我的代码将近1000行。Lars我已经看过了,但这只适用于一个节点/线路。如果可能的话,我想对多个节点执行此操作?请参阅@larskothoff当然有一种简单的方法可以应用此操作:links.classed(“hidden”,function(o){return d.index==o.source.index | d.index==o.target.index?false:true;});到所有选定的节点,而不是一个节点?哇。很好的回答:)干杯。你说的是d3.selectAll('.selectedNode'),我可以为节点这样做,但如果我要为边这样做,我必须看看边源和目标是否被分类为“selectedNode”,我该如何处理?除非您将边分类为
。selectedEdge
或维护一个selectedEdge数据结构,否则我看不到一个简单的方法来处理这个问题。这就是我想要的要做的是给他们一个类,但要做到这一点,你必须检查它的源节点和目标节点,看看它们是否有一个可见或隐藏的类:/:(我不确定我是否理解你的意思。你的
链接
变量指的是什么?这不是你的链接选择吗?如果是,那么你的答案是2)更新代码@reno不知道这是否有帮助:/我想做的是,如果源和目标链接可见,则显示链接,如果其中任何一个隐藏,则不显示链接
function shouldBeVisible(nodeIndex){
    // visible if either selected itself or neighbour of a selected node
    return selected.some(function(d){
        // assuming you don't care about the direction of your edges
        return linkedByIndex[nodeIndex+','+d]+linkedByIndex[d+','+nodeIndex];
    });
}
function shouldBeVisible(sourceIndex, targetIndex){
    if (targetIndex !== undefined)
        return shouldBeVisible(sourceIndex)
            && shouldBeVisible(targetIndex);
    else return selected.some(function(d){
        return linkedByIndex[sourceIndex+','+d]
             + linkedByIndex[d+','+sourceIndex];
    });
}
links.classed("hidden", function(d) {
    return !shouldBeVisible(d.source.index, d.target.index);
});