『 每日一题』手写每日一题之数组去重

1,088 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 15 天,点击查看活动详情

数组去重

在面试中,除了常见的防抖节流,面试官还经常会给我们出数组相关的题目,可能会让我们手写数组去重,今天我们就继续来盘一下面试中常见的手写题 -- 数组去重

数组去重的方法其实有很多,在 ES6 中,我们最常见的就是使用 Set 来完成数组去重,相关代码如下:

[...new Set([...a, ...b])];

一般如果手写出这个方法,面试官可能会问你还有没有其它的实现方法,因为 SetES6 提供给我们直接使用的方法,如果没有这个方法,那我们该如何实现数组去重呢?

其实在 ES6 中,还提供了很多关于数组的其它操作方法,像 filterincludes 等新增的 API,我们都可以利用起来,下面我们一起来看一下如何使用 filter 完成数组的去重。

如果要使用 filter 这个 API,我们还需要 indexOf 配合使用才能完成数组去重,下面我们一起来看一下相关代码,如下:

function distinct(a, b) {
    let arr = a.concat(b);
    return arr.filter((item, index)=> {
        return arr.indexOf(item) === index
    });
}

我们定义一个 distinct 函数,第一行代码是将两个数字合并在一起,然后通过 filter 来筛选所有的元素,并且通过 indexOf 方法来查找当前合并的数组中是否已经存在某个元素,最后找到所有已经存在的元素,返回筛选的结果,就实现了数组的去重。

当然,除了使用 filter 方法,我们还可以使用 includes 来完成数组的去重,大致的原理其实与 filter 差不多,只是我们需要自己完成外部的循环,而使用 filter 方法,它会帮我们完成循环,接下来我们一起看一下如何使用 includes 完成数组去重,代码如下:

function distinct(a, b) {
    let arr = a.concat(b);
    let result = [];
    for (let n of arr) {
        !result.includes(n) && result.push(n);
    }
    return result;
}

使用 includes 唯一需要注意的就是,我们要自己循环最初合并的数组,然后通过 includes 方法判断当前的值不在 result 数组中存在,这样就能将不存在的值添加到 result 中,最后返回去重后的数组。

除了上面的这几种方法,其实在 ES5 中还提供了一个方法,它就是 sort,我们可以通过 sotr 对数组进行排序,然后比较相邻元素是否相等,从而排除重复项,实现起来也很简单,我们一起来看代码:

function distinct(a, b) {
    let arr = a.concat(b);
    arr = arr.sort();
    let result = [arr[0]];
    for (let i = 1, len = arr.length; i < len; i++) {
        arr[i] !== arr[i-1] && result.push(arr[i]);
    }
    return result;
}

和前面的 includes 方法差不多,都是先合并两个数组,然后通过 sort 方法将数组进行排序,并获取到数组中的第一个值,最后通过循环不断从 result 中判断当前的值是否存在,如果不存在就直接添加到 result 中,并返回最终去重后的数组。

在面试中,一般我们能够写出两种或两种以上,那么基本这个题目就稳了。不过在实际的开发中,如果只是做单纯的数组去重,我们完全可以通过 Set 来实现,但如果要去重的是数组对象,那么上面的这些方法其实就都不适用了。

最后,还是那句话,面试是面试,工作是工作。面试能力强不代表工作能力强,一起共勉!

参考

www.cnblogs.com/wisewrong/p…

segmentfault.com/a/119000001…