在实际开发工作中,经常会遇到需要对数组进行去重的操作,基于这个需求,我在这里分享一下我本人常用的数组去重的方案
基本数据类型的数组去重
Set去重
Set对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
这是MDN上对Set的描述,所以使用Set去重在我看来是最简单,代码量最少的方式了,代码如下:
const basic = [NaN, NaN, -0, +0 , 1, 1, 'a', 'a', true, true, false, false, null, null, undefined, undefined, Symbol(1), Symbol(1), 9007199254740991n, 9007199254740991n]
console.log(...new Set(basic));
这是对基本数据类型也就是原始值的去重,那对象引用又是个啥呢?我们知道,Object是引用数据类型,实际值储存在堆内存中,栈内存中存储的是一个指向该值的一个地址,那么对象引用就很好理解了,表示指向实际值的内存地址,如下:
去重效果如下所示:
虽然a和b的值相同,但是他们指向不同的内存地址,而d直接拷贝c的对象引用,所以c === d,Set本质上也是对内容进行全等比较,不过有一个例外的就是NaN,因为NaN !== NaN,对此,MDN上也有相应的解释
另外,
NaN和undefined都可以被存储在 Set 中,NaN之间被视为相同的值(NaN 被认为是相同的,尽管 NaN !== NaN)。
reduce + includes 去重
对数组进行遍历,只搜集第一次出现的数据,示例如下:
const basic = [NaN, NaN, -0, +0 , 1, 1, 'a', 'a', true, true, false, false, null, null, undefined, undefined, Symbol(1), Symbol(1), 9007199254740991n, 9007199254740991n]
basic.reduce((pre, cur) => pre.includes(cur) ? pre : pre.concat([cur]), [])
前端小渣渣的学习总结,如有错误,欢迎指正!!