JavaScript 数组去重|刷题打卡

111 阅读1分钟

JavaScript 数组去重|刷题打卡

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

FED5 数组去重

为 Array 对象添加一个去除重复项的方法

输入

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]

输出

[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']

二、思路分析:

  1. 首先遍历数组,找出重复元素并进行删除,大部分情况可以用 === 比较。注意可以用this.length来作为for循环的边界条件,length会随着删除而变化,不会导致溢出的问题。
  2. 单独处理NaN,用数组NaNarr记录NaN元素的下标,便于二次筛选
  3. 删除重复的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