前端大挑战_牛客_FED5——数组去重

题目描述

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

示例1

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

思路一

利用Set去重。

题解一

Array.prototype.uniq = function () {
    return Array.from(new Set(this));
}

思路二

用空间换时间。用一个Object对象或者Map存基本类型的数据出现过与否,出现过进行拦截;引用类型的数据直接放行。

题解二

Array.prototype.uniq = function () {
    let newArr = [];
    let vis = {};
    for(let i=0;i<this.length;i++){
        if(["number", "boolean", "string", "symbol", "null", "undefined"].includes(typeof this[i])){
            if(!vis[`${typeof this[i]}${this[i]}`]){
                vis[`${typeof this[i]}${this[i]}`] = true;
                newArr.push(this[i]);
            }
        } else {
            newArr.push(this[i]);
        }
    }
    return newArr;
}

扩展

这道题不需要判断引用类型是否相等,如果有这个需要,那就更加麻烦。这里的“引用类型相等”是引用同一个对象而不是内容完全相等。
我们可以通过判等去判断两个引用对象是否相等,但是我们不能获取内存地址或者其它标识符进行识别。
如果在需要判断引用类型是否相等的情况下,有除了Set和暴力一一对比之外的方法,欢迎交流探讨。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数组去重应该是面试必考问题之一。 虽然它是一道并不复杂的问题,但是也能看出面试者的广度和深度,还有考虑问题的全面性...
    前端小咖阅读 210评论 0 0
  • 数组去重 是常见的面试考点,所以我就试着深入学习一下。网上也有很多数组去重的文章,但我自己觉得分析地不够深入,其实...
    前端西瓜哥阅读 667评论 0 1
  • 前言 本文2895字,阅读大约需要12分钟。 总括: 本文总结了10种常见的数组去重方法,并将各种方法进行了对比...
    秦至阅读 549评论 0 2
  • 关注 如何答一道惊艳面试官的数组去重问题? 为什么写这篇文章? 数组去重应该是面试必考问题之一。 虽然它是一道并不...
    冇得感情阅读 252评论 0 1
  • 数组去重是开发中经常会遇到的问题,也是面试时经常会考到的。JS实现数组去重可以有多种方法: 一、简单的去重方法 用...
    Amos_Shen阅读 845评论 0 0