面试前端数组去重,我会问这3个小问题

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

关于数组去重已经是一个老生常谈的问题了网络上已经有N篇关于数组去重的讲解了所以凡是能看见这篇博客的我们都是有缘人希望2023年你可以乘风破浪职击沧海。而一般面试的时候关于数据去重也是一个必问的问题我一般都会问下面这3个小问题。

 

目录

一、请说一下数组去重的项目使用场景 

1、时间轴

2、前端银行属地显示实例

二、说一下数组去重的几种实现方法吧 

1、第1种

2、第2种 

3、第3种 

4、第4种

5、第5种 

6、第6种 

三、你最喜欢用哪一种?

我最早喜欢这个简单的 

现在喜欢这个object形式的

四、分享一个我的案例

这里分享一个我曾经的成功案例


一、请说一下数组去重的项目使用场景 

在问题数组去重之前我会礼貌的问一下数组去重你常用吗?一般得到的回答也是当然常用啊(可能他还想说我必须常用啊我天天用一直用就在刚才我准备面试的时候还看了看数组去重的几种实现方法呢。然后我就问了一下请你说一下数组去重的项目场景。

他略微沉思了一下没有说话然后不太好意思的说有一次服务端返回的一个数组里面多条含有重复数据我就用到了数组去重。我问可以说一下大概的场景吗不用说的太细。后来他没有理我。

我这里说两个会用到数组去重的场景吧。

1、时间轴

 这里随便举个例子啊其实做成真实网站找到真实的例子肯定要做样式美化的。这个时间轴例子呢以年月日做为时间轴的汇总点而汇总点的子项就是这个时间下所要记录的列表内容。这种情况下服务端返回的必定是数组形式数据格式大概像是这样

data = [
      {
        time: '2022-12-21 08:03:34',
        title: '使用css3实现一个超浪漫的新年倒计时'
       },
       {
         time: '2023-01-02 23:50:55',
         title: '我辛辛苦苦做了一个月的项目组长年底用来写了晋升PPT'
        },
        {
          time: '2023-01-03 22:36:01',
          title: '内卷对于2022是一种无奈也是一种修行'
        },
        {
           time: '2023-01-03 23:42:38',
           title: '前端bug每次都比后端多我总结了5点原因'
        },
]

注意因为每个人的博客或者是一个写作历程必定是一个长时间发生的过程所以数据一定是不定量的可能还带有分页所以服务端不可能预先将数据整理成前端需要的样子所以这个时候数据中的年月日部分便成了重复的需要去重的部分去重后用于本案例汇总点的显示

2、前端银行属地显示实例

有很多网站内有这样一个页面银行属地显示因为全国各地大大小小的银行有非常多我们需要显示成这样

 很多时候服务端也不会先将北京天津上海等属地给我们抽成map的key值形式因为一些原因也是以数组形式返回到前端而这个数组大部分时候也是直接从数据库拉取的数据这就导致需要我们前端做一些数组去重服务端数据大概是这样子

data = [
       {
           city: '北京',
           name: '北京银行1'
       },
       {
           city: '北京',
           name: '北京银行2'
      },
      {
           city: '北京',
           name: 'XX商业银行'
      },
      {
           city: '天津',
           name: '天津银行1'
      },
      {
          city: '天津',
          name: '天津商业银行'
      },
      {
          city: '天津',
          name: '港口商业银行'
     },
]

这样一描述类似场景想起来的是不是就很多了这个案例中数组内的city字段就是需要去重的对象。

二、说一下数组去重的几种实现方法吧 

因为真实项目中去重可能不仅仅是对一些数字的去重可能还包含一些字符串数字混合的场景所以我们这里随意想一个混合数组例如

var arr = ['2022-03-21', 3, 8, 5, 3, 4, 3, '2022-03-21', '2022-03-22', 8];

1、第1种

第1种是定义一个新的空数组再执行嵌套双循环监测空数组中如果没有的元素push进空数组中。这个方法考察了continue的初级使用也是一种思想第一次空数组必定无内容我们pus一个元素跳过第一次循环第二次再进行循环对比代码如下

var newArr = [];
for (var i=0;i<arr.length;i++) {
	if (newArr.length === 0) {
		newArr.push(arr[i]);
		continue;
	}
	for (var j=0;j<newArr.length;j++) {
		if (newArr.indexOf(arr[i]) === -1) {
			newArr.push(arr[i]);
		}
	}
}

2、第2种 

第2种是第一种的改进也是新定义一个空数组利用indexOf监测新数组中是否包含某个元素代码如下

var newArr = [];
for (var i=0;i<arr.length;i++) {
    if (newArr.indexOf(arr[i]) === -1) {
	    newArr.push(arr[i]);
    }
}

3、第3种 

第3种就是es6之后出的set了set本身的设定就是非重复的类数组所以才有了数组与set互相转换的知识点而set转为数组可以是 [...set]这种解构形式也可以是Array.from(set)的方法代码如下

var mySet = new Set(arr); // 非重复的类数组
			
// var newArr = Array.from(mySet); // set转数组
var newArr = [...mySet]; // 或者是这种解构方法

4、第4种

 利用filter的内置方法filter接收一个内置函数而函数自身又接收3个参数item相当于arr[i]index相当于i索引arr就是数组本身某些情况需要传入arr但本案例因为比较简单就不传入了。利用indexOf首次查找索引的方式返回原数组中元素首次出现的所有元素达到去重效果代码如下

var newArr = arr.filter((item, index) => {
	return arr.indexOf(item) === index;
})

5、第5种 

第5种是利用数组内置的includes方法监测数组中是否包含某个元素如果你在面试中说出这一条证明你至少对数组的新属性或者是一些内置方法做过整理是个不错的回答代码如下

var newArr = [];
for (var i=0;i<arr.length;i++) {
	if (!newArr.includes(arr[i])) {
		newArr.push(arr[i]);
	}
}

6、第6种 

第6种就是创建一个新的map(或者说是object对象利用其key值唯一的特性不断的往map内创建属性一旦某属性被创建过那么就说明了可以对这个属性值做一些操作而属性就已经是哪个去重的唯一元素了代码如下

var obj = {}; // 对象的key值是唯一的
var newArr = [];
for (var i=0;i<arr.length;i++) {
	if (!obj[arr[i]]) {
		obj[arr[i]] = arr[i];
	}
}

三、你最喜欢用哪一种?

 数组去重不止这几种实现方法对吧那么你说出了那么多种其实每次做项目的时候某种场景下也就是用1种不可能这个需求我把每个都用了吧那么你最喜欢用哪一种呢?

我最早喜欢这个简单的 

其实最早的时候我喜欢第1种因为那个时候技术实在是太辣鸡不过想想现在也很辣鸡所以很多时候我不敢输出干货自己干货也不多二来输出来了跟大家重复也挺高那么多写知识点的人家为啥就喜欢看我的呢。而且当时我还把第一种实现方法当做是瑰宝四处跟人家显摆屡试不爽哈哈不过后来我又看是用第二种了。

现在喜欢这个object形式的

现在呢我比较喜欢第6种因为结合很多项目场景其实开发过程中很少有拿过来一个纯数组让去重的大部分时候就像上面说到的案例去重是为了解耦将去重出来的部分做为一个大的key值而value部分呢有时候是一些子数组有时候是更多的数组所以我比较喜欢第6种直接将原聚合数组解开然后处理成map对象形式再在页面进行一些渲染。

四、分享一个我的案例

面试题这个东西是怎么出来的呢?是在大家慢慢工作中不断遇到痛点无数人总结出来的结果慢慢发展成为了一道面试题所以面试题的解法一般去网上查一查背一背可以搞定。

但有一些面试官你答的不顺利他就想你来面试网上的答案那么多你咋就不背一背呢?你答的太顺利他又想这货肯定是被答案了跟网上说的如出一辙。

所以建议大家面试的时候把面试题答案多结合一下自己的项目经验把面试结果带入到项目经验中去解答如果解答后呢还能略微说一说自己遇到的问题说一说自己的心得那么我觉得面试官可能会为你的真诚打动一下吧。

这里分享一个我曾经的成功案例

之前面试过一家公司面试前端开发人家不出前端面试题人家说那些题。比如一块肉张三给了假钱老板去换了真钱然后又赔了钱丢了肉之类的当然还有一些其他耐人寻味的类似的问题。我这破智商哪能这么快搞定那么多破问题啊而且有些题你越想越容易陷入思考越想自己的思路好像越不对。

我当时直接在纸上这么写

var num = 100; // 这是最初的100元

num += 200; // 这时候的num为300元是老板获得肉钱的那一步

我直接把这种题以代码的形式工工整整的写上注释交上去了

当然你也可以写上拒绝做这类破题老夫告辞

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6