Set怎么用:我实测后的写法

Set怎么用才不别扭?我最近在一个表格批量选择功能里连续用了一周,感觉它最香的不是“去重一行代码”,而是管理选中状态特别稳。下面按写法对比聊实测体验。

数组写法 vs Set写法:选中状态差很多

以前我用数组存选中的行ID:selectedIds.push(id),取消时 filter 掉。能跑,但要手动防重复,快速连点时还容易出现同一个ID进数组两次。

换成 Set 后舒服很多:选中就 add,取消就 delete,判断勾选状态用 has。重复 add 没副作用,这点在表格、树控件、标签选择器里特别省心。

add/delete vs push/filter:操作意图更直

push 的意思是追加,filter 的意思是过滤,它们本身不直接表达“选中/取消”。Set 的 add/delete 更像业务动作,读代码时脑子不用多转一圈。

我的实际写法是:const next = new Set(selectedSet); checked ? next.add(id) : next.delete(id); setSelectedSet(next)。在 React 里别原地改同一个 Set,不然状态更新可能不触发,这是重点。

想要完整资源?

会员专享,海量内容

立即查看 →

has vs includes:渲染列表时更安心

表格有 2000 行时,每行都要判断 checkbox 是否选中。数组 includes 每行查一次,数据越多越拖。Set.has 的体验更稳,尤其是勾选一页、切换分页、再回来时。

小数据时你可能看不出差别,但代码语义已经变清楚了:selectedSet.has(row.id) 一眼就是“这个行ID是否被选中”。这比 selectedIds.includes(row.id) 更像集合操作。

展开运算符 vs Array.from:转数组怎么选

提交接口时,Set 还是要转数组。我常用 [...selectedSet],短、顺手,适合业务代码里快速处理。Array.from(selectedSet) 更显式,团队里新人多时也不错。

别直接把 Set 丢给 JSON.stringify。我实测过,结果是 {}。正确姿势是 JSON.stringify([...selectedSet])。这不是语法洁癖,是接口能不能收到数据的问题。

原地修改 vs 创建副本:框架里别偷懒

原生 JS 里 mySet.add(id) 没问题,但在 React、Vue 这类响应式环境里,原地改可能让视图不更新,或者更新时机很怪。

我现在固定用副本:const next = new Set(oldSet),改 next,再交给状态管理。多写一行,但 bug 少很多。Set怎么用这件事,语法只占30%,和框架状态配合才是剩下的70%。

常见问题

Set怎么用来数组去重?
基本类型数组可以写 [...new Set(arr)]。对象数组不适合直接这样去重,要按 id 等字段处理。
React里Set怎么用比较安全?
不要原地 add/delete 后直接 setState。同一个引用可能不触发更新,建议 new Set(oldSet) 创建副本再修改。
Set怎么遍历?
可以用 for...of,也可以先转数组再 map,比如 [...mySet].map(...)。Set 本身也支持 forEach。

获取完整内容

加入会员,海量资源任你看

立即进入 →