【问题标题】:Cannot get vis.js last or first selected network node无法获取 vis.js 最后或第一个选择的网络节点
【发布时间】:2015-04-11 00:57:31
【问题描述】:

我正在使用 vis.js,并且已经研究了如何获取所有当前选定节点的数组。

var TempNodes = network.getSelectedNodes();

我的问题是 getSelectedNodes() 数组返回所有节点 id 的数字顺序从最低到最高...似乎没有办法告诉最后选择的节点 id 是什么或什么第一个选择的节点 id 是。我只能知道选择了哪些节点 ID。

有谁知道一种方法可以从 getSelectedNodes 数组中找出第一个或最后一个选择的节点 id 是什么?

【问题讨论】:

    标签: javascript chap-links-library vis.js


    【解决方案1】:

    使用 tucuxi 提出的概念,我确实想出了一些工作代码来实现这一点。尽管 tucuxi 的代码“开箱即用”并不能正常工作,但他的想法是合理的,他值得称赞。

    这是最终对我有用的代码

     var PreviouslySelectedNodes = [];
        var SelectedNodesInOrder = [];
    
        network.on('select', function (properties) {      
    
          // itterate through each visjs selected nodes and see if any value is not present in our current ordered list
          // If it's not already present, push it to the top of our ordered list
          var SelectedNodeIDs = network.getSelection().nodes // First get all the visjs selected nodes
    
          // If only one Node is currently selected, then empty the SelectedNodesInOrder array ready for a new set
          if(SelectedNodeIDs.length == 1){
              SelectedNodesInOrder = [];
          }
    
          // Cycle through all current selected visjs nodes
          for(var t = 0; t <= SelectedNodeIDs.length; t++){
    
              // cycle through all currently selected ordered nodes in our ordered array
              var found = false; flag the default as this node not already in our ordered list
              for(var y = 0; y <= SelectedNodesInOrder.length; y++){
                    if(SelectedNodesInOrder[y] == SelectedNodeIDs[t]){ // This node already exists in our ordered list
                        found = true;
                    }         
              }
    
              // If the current visjs selected node doesn't already exist in the SelectedNodesInOrder, then add it
              if(found === false){
                    SelectedNodesInOrder.push(SelectedNodeIDs[t]);
              }
    
          }
    
        console.log(SelectedNodesInOrder); // test by dumping our ordered array list to the console
    
        });
    

    【讨论】:

    • 我没有测试我的答案,这是真的。但是,习惯上会解释答案失败的原因,因为我可以对其进行编辑以改进它。 Also, your answer is slow when many nodes are selected -- O(n^2);我的,修复后应该快得多:O(n)
    • 是的,你可能是对的。如果您修复它,我会将其更改为正确的(并且通过更快更好)答案。没问题。
    【解决方案2】:

    documentation 明确指出getSelection()

    返回一个包含所选节点 ID 的数组。如果没有选择节点,则返回一个空数组。选择没有排序。

    由于目前选择多个节点的方式是long-press他们,你可以自己保持选择顺序,通过监听选择事件:

    var mySelectionOrder = [];
    var previouslySelected = {};
    network.on('select', function(p) {
          var selected = {};
          // add newly-selected nodes at end of mySelectionOrder
          p.nodes.forEach(function(n) {
                if ( ! previouslySelected[n]) { mySelectionOrder.push(n); }
                selected[n] = true;
          });
          // remove newly-unselected entries from mySelectionOrder
          mySelectionOrder = mySelectionOrder.filter(
                function(e, i, a) { return selected[e]; });
          // prepare for next run
          previouslySelected = selected;
          // output to console to make sure it works
          console.log("Selection updated", mySelectionOrder);
    }); 
    

    (已编辑以修复 JS 代码;经测试可与 this example 一起使用)

    【讨论】:

    • 谢谢吐槽西,我现在不在电脑旁,但我一回到家就试试。
    • 嗨图慈西,虽然我得到了一个很好的数字数组......即......0,1,2等......我没有得到已选择节点的ID。
    • 只是为了澄清一点......每个节点都存储为这样的 json 对象.. {id: 123, label: 'Test Node',group: 'My Group' }.. .我需要按照它们被选中的顺序获取每个当前选中节点的id。
    • 另外...与文档相反,getSelection() 确实返回所有选定的节点,但它们基于节点 id 属性以数字升序返回。例如,以 3、1、2 的顺序选择节点 ID - 然后使用 getSelection() 将按 1、2、3 的顺序返回节点 ID。
    • @Craig - 如果文档说“未订购”,这实际上意味着“不要依赖此订购,即使现在是订购,因为我们可能会一时兴起对其进行更改”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多