使用cytoscape.js选择其属性(数组类型)包含特定值的节点

Qer*_*bin 6 javascript cytoscape.js

我目前正在可视化网络,其中节点具有类型列表的属性,例如:

{"data": {"name": "b", "go": ["c", "d", "f"], "id": "n0"}, "group": "nodes"},
{"data": {"name": "a", "go": ["a", "b", "c"], "id": "n1"}, "group": "nodes"},
{"data": {"target": "n0", "source": "n1", "id": "e1"}, "group": "edges"}
Run Code Online (Sandbox Code Playgroud)

是否有可能使用cytoscape.js选择list-attribute(示例中的'go')包含特定值的所有节点?

就像是:

cy.elements('node[go.contains("b")]')
Run Code Online (Sandbox Code Playgroud)

哪个会选择节点n1 ......

提前谢谢了

max*_*anz 4

替代方案:如果不需要使用选择器,则可以使用过滤器函数并将属性保留为数组:cy.elements().filter(function(){ return this.data('go').indexOf('foo') >= 0; })

在选择器中进行数组包含检查可能会很昂贵,因为它们最常在样式表中使用——只要状态发生变化就需要应用样式表。目前,无法使用现有选择器和当前数据结构执行您所建议的操作。

您可能会发现使用对象比使用数组更容易。该对象可以是简单的 name:true 对,例如go: { foo: true, bar: true }。由于undefined是 falsey,您只需定义数组中的正例即可。

这样,您可以使用一个简单的选择器node[go\\.foo](或者node[?go\\.foo]如果您想更明确一点)。在您自己的代码中进行检查也更简单、更便宜(例如node.data('go.foo') ? 'has it' : 'does not')。