上期讨论了 Set 的基本知识,一文了解 JavaScript 中的 Set(集合)文末提到使用 Set 进行数组去重。
通常去重的例子都是简单数组,存储的都是基本类型,例如 ——
而在实际项目中,需要去重的数组,其数据结构可能更加复杂。
JSON 数组去重
JSON 数组是比较常见的一种数据结构,形如 [{...}, {...}]。假如需要统计出某个属性中不同的值。
先使用 .map 将 JSON 数组转变成简单数组,然后再执行去重。
由于生成的 Set 属于可迭代对象,所以可以使用数组解构符进行解构。
二维数组去重
二维数组在实际项目中也经常会遇到,形如 [[...], [...]]。
我们可以将 Set 用作存储每项的唯一值,结合 reduce 进行比对,得出无重复的项目。
当然,上面代码的缺点还是不少的。因为只是简单地将其转变成字符串作为比对的键,所以不能区分 [1, 2]、['1', '2']、['1,2'] 等子数组,
怎样对其进行优化欢迎讨论。
数组之间的比对
Set 的特性不单单可以用于单数组,对于数组之间的比较也是十分在行。
例如筛选出 A 数组有,而 B 数组没有的元素。
这里将 A 数组每一项元素和创建的 Set 比对,将 Set 中没有的筛选出来。
当然,这段代码也是不太完美。首当其冲是每次遍历中都需要创建一次 Set,而且代码阅读起来不够直观。
我们将它转换到数学上集合的概念,假如 A、B 都是集合,筛选出 A 有而 B 没有的元素,相当于求补集,这样就更加好理解。
可惜集合中没有提供内置方法供我们使用。
结语
Set 的内置方法,不单单没有提供补集,常用的交集,并集,子集等都没有提供。
针对这个问题,下期将跟大家一起,一步步扩展出一个更强大的 Set。并且结合单元测试,将它发布到 NPM 中。
PS:写文不易,希望大家多多点赞。有什么想法欢迎评论区讨论。