首页/新闻资讯/正文详情

cytoscape.js 集合操作详解:eles.union() 合并元素集合的用法与底层实现

发布时间:2026/9/23 10:52:52 来源:云帆数科 栏目:资讯中心
cytoscape.js 集合操作详解:eles.union() 合并元素集合的用法与底层实现
cytoscape.js 集合操作详解eles.union() 合并元素集合的用法与底层实现【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js本篇技术指南聚焦 cytoscape.js 中eles.union()这一集合构建 API讲解如何将两个元素集合Collection合并为一个去重的新集合以及如何直接传入选择器Selector完成集合合并。你将掌握union()及其全部别名u、add、or、|、的实战用法并了解它与intersection()、difference()、symmetricDifference()等兄弟 API 的区别最后通过源码src/collection/filter.mjs与单元测试test/collection-building-and-filtering.mjs理解其内部实现与去重原理。一、union() 是什么union()是 cytoscape.js 元素集合的并集运算它返回一个新的集合其中包含调用它的集合与传入集合中的所有元素重复元素只会出现一次自动去重。原集合不会被修改。在 cytoscape.js 中集合的构建与过滤是日常操作的核心能力union()属于该能力组中的成员官方文档统称其为building filtering构建与过滤操作。在 index.d.ts 的类型定义中它的完整签名如下type CollectionBuildingUnionFunc ( eles: CollectionArgument | CollectionArgument[] | Selector, ) CollectionReturnValue;可见union()接受三种参数形态参数类型说明CollectionArgument另一个元素集合Collection或单个元素/元素数组CollectionArgument[]元素数组Selector选择器字符串匹配当前图中符合条件的元素作为合并来源返回值CollectionReturnValue是新的集合不会影响调用方与传入集合。二、基础用法官方示例详解根据 documentation/md/collection/union.md 的示例union()有两种典型调用方式。2.1 与另一个集合合并var j cy.$(#j); var e cy.$(#e); j.union(e);这里cy.$(#j)与cy.$(#e)分别通过 ID 选择器取出图中的两个元素可以是节点也可以是边j.union(e)返回同时包含#j与#e的新集合。2.2 直接传入选择器cy.$(#j).union(#e);无需先单独获取元素union()内部会把选择器#e解析为当前图中匹配的元素集合再与调用方的集合做并集。这适合链式调用场景代码更简洁。2.3 与merge()的区别从语义上看union()与merge()原地合并容易混淆需要注意区别union()底层即add()返回新集合调用方集合保持不变merge()原地修改调用方集合把新元素追加进去返回调用方自身以支持链式调用。两者底层都通过元素 ID 映射进行去重判断但前者是纯函数式操作后者是原地操作。三、别名体系u / add / or / | / union()在源码层拥有一套完整的别名映射。见 src/collection/filter.mjs 中的注册逻辑let fn elesfn; fn[ u ] fn[ | ] fn[ ] fn.union fn.or fn.add;也就是说以下写法完全等价j.union(e); j.u(e); // 单字母缩写 j.add(e); // add 是 add 语义行为与 union 相同 j.or(e); // 逻辑或语义 j|; // 数学集合符号 j; // 加法语义在 index.d.ts 的接口定义中同样可以看到这些别名被完整声明union: CollectionBuildingUnionFunc; u: CollectionBuildingUnionFunc; add: CollectionBuildingUnionFunc; : CollectionBuildingUnionFunc; or: CollectionBuildingUnionFunc; |: CollectionBuildingUnionFunc;从源码结构看union的真正实现落在add()函数上。阅读 src/collection/filter.mjs 中add()的实现可以清晰看到去重逻辑add: function( toAdd ){ let cy this._private.cy; if( !toAdd ){ return this; } if( is.string( toAdd ) ){ let selector toAdd; toAdd cy.mutableElements().filter( selector ); } let elements this.spawnSelf(); for( let i 0; i toAdd.length; i ){ let ele toAdd[i]; let add !this.has(ele); if( add ){ elements.push(ele); } } return elements; }关键点有三个空参数短路未传参数时直接返回调用方集合选择器归一化传入字符串选择器时先用cy.mutableElements().filter(selector)将选择器解析为实际元素集合因此与选择器合并与与集合合并最终走同一逻辑去重保障用this.has(ele)判断元素是否已在结果中已存在的元素不再重复追加从而保证并集结果中每个元素只出现一次。四、与相邻集合运算 API 的对比union()不是孤立的cytoscape.js 在同一个能力组中提供了完整的集合代数运算。在 src/collection/filter.mjs 末尾可以看到一整套别名注册fn[ \\ ] fn[ ! ] fn[ - ] fn.difference fn.relativeComplement fn.subtract fn.not; fn[ n ] fn[ ] fn[ . ] fn.and fn.intersection fn.intersect; fn[ ^ ] fn[ () ] fn[ (-) ] fn.symmetricDifference fn.symdiff fn.xor; fn.complement fn.abscomp fn.absoluteComplement;对应的 API 一览API别名数学含义行为union()u、add、or、|、A ∪ B两集合的所有元素去重intersection()intersect、and、n、、.A ∩ B同时存在于两集合的元素difference()subtract、not、relativeComplement、\、!、-A − B调用方集合中不在另一集合中的元素symmetricDifference()symdiff、xor、^、()、(-)A △ B只在其中一个集合出现的元素absoluteComplement()abscomp、complement∁A全图中不在调用方集合中的元素它们的官方示例文档分别位于 documentation/md/collection/intersection.md、documentation/md/collection/absoluteComplement.md 及同目录下的difference.md、symmetricDifference.md。例如intersection()的典型场景是求两个节点邻居的交集var jNhd cy.$(#j).neighborhood(); var eNhd cy.$(#e).neighborhood(); jNhd.intersection( eNhd ); // 同时与 #j、#e 相邻的节点而union()的对应场景则是合并两组邻居得到所有相邻节点的并集var jNhd cy.$(#j).neighborhood(); var eNhd cy.$(#e).neighborhood(); jNhd.union( eNhd ); // 所有与 #j 或 #e 相邻的节点从实现细节看intersection()在传入选择器时是过滤语义直接this.filter(selector)而传入集合时遍历较短的集合配合has()判断以提升性能union()/add()则始终以调用方集合为基础追加去重。理解这些差异有助于在具体场景中选择最合适的 API。五、单元测试验证仓库的单元测试 test/collection-building-and-filtering.mjs 直接覆盖了union()的底层实现add()it(eles.add(), function(){ expect( n1.add(n2).length ).to.equal(2); expect( n1.add(n2).same( cy.$(#n1, #n2) ) ).to.be.true; });测试断言了add()即union()的两个关键性质n1.add(n2).length等于 2说明两个不同元素合并后产生包含两个元素的新集合n1.add(n2).same( cy.$(#n1, #n2) )为真说明合并结果与直接通过选择器#n1, #n2选出的集合同一same()判断两个集合是否包含完全相同的元素与顺序无关验证了去重与完整性。同文件中还有not()、intersect()、merge()等相邻运算的测试可一并作为阅读参考。六、实战建议与注意事项去重语义union()天然去重即使传入集合与调用方有大量重叠元素结果中每个元素也只会出现一次无需手动unique()不修改原集合union()返回新集合适合函数式链式调用若希望原地累积元素例如在循环中动态收集可改用merge()选择器与集合可混用两个参数形式的行为完全一致优先选择可读性更好的写法当选择器较复杂如node[weight 50], edge.special时直接传选择器通常更直观TypeScript 支持union()及其全部别名在 index.d.ts 中都有完整类型声明配合CollectionArgument | CollectionArgument[] | Selector联合类型参数可在 IDE 中获得完整的类型提示与校验性能底层去重基于集合内部维护的 ID 映射merge()中可见map.has(id)的用法按元素 ID 判断重复整体为线性开销适用于较大规模的图数据操作。【免费下载链接】cytoscape.jsGraph theory (network) library for visualisation and analysis项目地址: https://gitcode.com/gh_mirrors/cy/cytoscape.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

前端改错图解原理:5步搞定Stack Trace
前端改错图解原理:5步搞定Stack Trace

前端改错图解原理:5步搞定Stack Trace 刚毕业接老代码,Console 里飘着满屏红色的 Error,StackTrace 长得像天书。 别慌,别复制粘贴去搜,那只会让你更晕。 咱们得用图解原理把堆栈拆开,像剥洋葱一样找到病灶。… · 2026/9/23 10:52:52

指针网络×强化学习:用Python求解旅行商问题的完整实现
指针网络×强化学习:用Python求解旅行商问题的完整实现

简介:这份压缩包提供了一套基于指针网络的旅行商问题强化学习 Python 实现,适合对深度强化学习与组合优化交叉方向感兴趣的开发者、研究生或竞赛选手。项目没有单独实现评论家网络,而是直接用最优路径长度作为评论家值,训练样本在… · 2026/9/23 10:52:52

浏览器端CNN手写数字识别:从模型训练到部署全流程
浏览器端CNN手写数字识别:从模型训练到部署全流程

简介:基于PyTorch框架的手写数字识别网页演示项目,借助卷积神经网络识别多类别手写数字,并将训练好的模型封装为本地网页交互服务,覆盖数据准备、模型训练到网页部署的完整流程,无需额外收集数据,适合深度学… · 2026/9/23 10:52:45

管家婆普普版报错全解:新手避坑与底层逻辑
管家婆普普版报错全解:新手避坑与底层逻辑

管家婆普普版报错全解:新手避坑与底层逻辑 盯着屏幕上一长串红色的英文字符,那种绝望感谁懂? Stack Trace 像天书一样刷屏,新手往往只能干瞪眼,不敢动鼠标。 想搞懂管家婆普普版的底层机制,这篇避坑指南请收好。… · 2026/9/23 11:23:48

词法分析(final)压缩包解析:从词法到MIPS的编译器全流程实战
词法分析(final)压缩包解析:从词法到MIPS的编译器全流程实战

简介:这是一份面向编译原理学习者与课程实践者的词法分析项目源码,围绕C语言文法实现,最终目标是将高级语言转换为MIPS汇编代码,适合正在做编译器课程设计或希望打通前端到后端流程的中高级学习者。压缩包共19个文件,以… · 2026/9/23 11:23:48

10分钟把 Taskmaster AI 接进 VS Code,让 PRD 变成可拖动的任务清单
10分钟把 Taskmaster AI 接进 VS Code,让 PRD 变成可拖动的任务清单

10分钟把 Taskmaster AI 接进 VS Code,让 PRD 变成可拖动的任务清单 【免费下载链接】claude-task-master An AI-powered task-management system you can drop into Cursor, Lovable, Windsurf, Roo, and others. 项目地址: https://gitcode.com/GitHub_Trending… · 2026/9/23 11:23:39

PDF加密编辑限制解除方法:打印转存与qpdf解密实操指南
PDF加密编辑限制解除方法:打印转存与qpdf解密实操指南

1. PDF加密提示背后的真实场景拆解1.1 为什么打开PDF会弹出加密提示很多人第一次碰到PDF加密提示,是在点击编辑、复制文字或者打印的时候。文件明明能正常打开、能翻页,但一旦想改一个字、提取一段内容,编辑器就弹出一个对话框,要… · 2026/9/23 11:23:39

8位FPGA CPU设计与实现:从指令编码到SignalTap调试
8位FPGA CPU设计与实现:从指令编码到SignalTap调试

简介:本资源是一套面向计算机体系结构初学者与数字电路实践者的8位CPU设计与实现教学包,聚焦CPU核心部件(ALU、控制器、寄存器组、存储器)的原理理解与VHDL建模能力培养,适用于高校《计算机组成原理》课程实验及FPGA平… · 2026/9/23 11:23:32

硬件测试规范实战:从原理图审查到自动化脚本的完整指南
硬件测试规范实战:从原理图审查到自动化脚本的完整指南

简介:这份硬件测试方案文档面向硬件工程师、测试人员及电子相关专业学生,聚焦整机与单板两类测试场景,帮助读者建立从测试目的、适用范围到判定准则的完整测试框架。资源包内含1个doc文件,约7.95MB,共76页,… · 2026/9/23 11:23:26

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码