JavaScript 数组去重|刷题打卡
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
为 Array 对象添加一个去除重复项的方法
输入
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
输出
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
二、思路分析:
- 首先遍历数组,找出重复元素并进行删除,大部分情况可以用 === 比较。注意可以用this.length来作为for循环的边界条件,length会随着删除而变化,不会导致溢出的问题。
- 单独处理NaN,用数组NaNarr记录NaN元素的下标,便于二次筛选
- 删除重复的NaN元素,注意 i>0 保留最先出现的一个NaN元素
三、AC 代码:
Array.prototype.uniq = function () {
/**
* while循环控制内层循环是否继续
* 内层二重for循环比较是否有相同元素,有则进行删除,并且置flag为1
*/
let flag = 1;
while (flag) {
flag = 0;
for (let i = 0; i < this.length; i++) {
for (let j = i + 1; j < this.length; j++) {
if (this[i] === this[j]) {
this.splice(j, 1);
flag = 1;
}
}
}
}
/**
* 单独处理NaN
* 用数组NaNarr记录NaN元素的下标
* 便于二次筛选
*/
let NaNarr = [];
for (let i = 0; i < this.length; i++) {
if (this[i] !== this[i]) {
NaNarr.push(i);
}
}
console.log(NaNarr)
/**
* 删除重复的NaN元素
* 注意 i>0 保留最先出现的一个NaN元素
*/
for (let i = NaNarr.length - 1; i > 0; i--) {
this.splice(NaNarr[i], 1);
}
return this
}
四、总结:
- JavaScript中比较元素是否相同可以用 ===
- 为什么不用 == ? 因为用 == 比较,涉及到js隐式转换的问题
- {} === {} // false
- "a" === "a" // true
- 对于NaN的判断 元素自身和自身用 === 比较,如果不相等,则元素为NaN