Cytoscape.js:获取类和return过滤节点。 (getter 不存在?)

Cytoscape.js: get classes and return filtered nodes. (getter not existent?)

这个问题产生于以下背景:

一个过滤器具有各种属性,例如演示 here

对于最小的工作示例,我们将考虑所有复选框代表节点的 classes 之一,例如

目标是能够根据此过滤器删除/添加节点。某些节点可能属于多个 classes。我可以让它与 hide/show 一起工作。该代码位于 post.

的底部

在这段代码中,我在鼠标离开下拉菜单时实现了过滤器。可能不理想,但足够了。我有一个对象 allNodeClasses,其中包含 classes 作为属性以及它们是否通过过滤器显示为布尔值,例如

allNodeClasses = {
class1: true
class2: true,
etc
}

下面的代码可以分为两个主要阶段,设置和过滤器(分别在 cy.batch... 之前和之后)。 首先,我更新布尔对象以判断它的相应按钮是否已被选中。然后对于每个节点,我遍历每个 class,看看它是否有一个设置为 false 的 class。如果是,则该节点被隐藏。如果该节点的所有 classes 都为真,则显示它(这将恢复任何以前的隐藏节点)。

将 remove 替换为 hide 并将 add/restore 替换为 show 无效(删除有效...)。即 - 我相信 - 某些功能在删除的节点上不起作用。

因此我有以下几个问题:

问题

1.) 我怎样才能使用 remove 和 add/restore 来完成这项工作?

2.) 节点 classes 有 'getter' 吗?因为 .classes 似乎仅作为 setter 工作,而 .class 也不起作用。

3.) 什么是切换 class... 因为我认为它可以在这里工作,但网站上没有任何有用的示例演示如何做到这一点。

问题 1 注意:问题 1 的理想解决方案不涉及创建和维护 removedElements 数组。

注意:在我看来,理想的解决方案是具有以下 sudo 代码

for elem in cyGraph                  \ for every item in the graph
    var keepQ = true                 \ assume default
    for class in elem.classes        \ for every class that 
                                     \ element belongs to
        if allClasses[class] == false\ if that class is false
            keepQ = false            \ we are not to keep it
            break                    \ no need to keep searching
    if elem.removedQ && keepQ        \ restore only removed elements
                                     \ that we should now keep
       elem.restore
    if !keepQ                        \ remove filtered out elements
       elem.remove

代码

$('#filter-wrapper').on('mouseleave',function(){

      var opts =[];
      for (var className in allNodeClasses) {opts.push(className)};

      var numOpts = opts.length;

      for (var i = 0; i < numOpts; i++) {
        allNodeClasses[opts[i]] = document.getElementById('filter-checkbox-'+opts[i]).checked
      };


        cy.batch(function(){




          cy.nodes().forEach(function(node){
            var keepQ = true;
             for (var i = 0; i < numOpts; i++) {
               if (node.hasClass(opts[i]) && !allNodeClasses[opts[i]]) {
                 keepQ = false;
               };
             };

             if (!keepQ) {
               node.hide();
             } else {
               node.show();
             }
           });



        });

只删除匹配未勾选的元素类。

例如如果未选中 foo 和 bar,则 cy.$('.foo, .bar').remove().