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

news2024/11/18 18:39:04

关于数组去重,已经是一个老生常谈的问题了,网络上已经有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元,是老板获得肉钱的那一步

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL调优-高性能业务表结构设计

目录 前言记录&#xff1a; 数据库表设计 范式设计 什么是范式&#xff1f; 数据库设计的第一范式 数据库设计的第二范式 数据库设计的第三范式 范式说明 反范式设计 什么叫反范式化设计&#xff1f; 反范式设计-商品信息 范式化和反范式总结 实际工作中的反范式实…

C++ stack和queue

1. stack的介绍和使用1.1 stack的介绍1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&…

基于深度学习的自然语言处理

1、什么是自然语言处理&#xff1f; 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、…

【信号与系统】预习笔记(每日更新ing)

2023.1.8已打卡 信号与系统&#xff08;一&#xff09;信号与系统概述1.0 常见三角公式1.1 信号与系统1.2 信号的表述、分类1.3 信号的运算&#xff08;二&#xff09;连续系统的时域分析&#xff08;三&#xff09;离散系统的时域分析&#xff08;四&#xff09;傅里叶变换与频…

软件质量保证与软件测试复习文档

目录 引言&#xff1a; 内容&#xff1a; 一、Ron patton《软件测试》中谈到的软件缺陷的定义被业界广泛认可&#xff0c;主要包括哪五条&#xff1f; 二、软件测试人员的主要工作职责是什么&#xff0c;一般围绕哪几个重要文档开展工作&#xff1f; 三、什么是软件测试模…

差分算法介绍

一、基本概念 差分算法是前缀和算法的逆运算&#xff0c;可以快速的对数组的某一区间进行计算操作。 例如&#xff0c;有一数列 a[1],a[2],.…a[n]&#xff0c;且令 b[i] a[i]-a[i-1],b[1]a[1]&#xff0c;那么就有 a[i] b[1]b[2].…b[i] a[1]a[2]-a[1]a[3]-a[2].…a[i]-a[i…

电脑开机密码忘记了怎么办?

相信很多朋友为了保护自己的隐私&#xff0c;都会在自己的电脑设置开机密码&#xff0c;但有时候电脑太久没用&#xff0c;就有可能忘记开机密码了&#xff0c;这可怎么办&#xff1f;别着急&#xff0c;今天就跟大家分享两种苹果电脑忘记开机密码解决方式&#xff0c;适用于Ma…

使用Junit进行单元测试的简单例子

首先新建一个工程&#xff0c;选择合适的路径和JDK版本&#xff0c;其它默认就行。 把Main.java内容改为如下。 后面就是对add方法增加单元测试 public class Main {public static void main(String[] args) {System.out.println("Hello world!");}public static i…

计算机网络——应用层协议原理

目录 1. 网络应用体系结构 1.1 客户机/服务器结构 1.2 P2P结构 1.3 混合结构 2. 进程通信 2.1 标识进程通信 2.2 套接字(socket) 3. 网络应用的服务需求 3.1 可靠数据传输 3.2 吞吐量 3.3 定时 3.4 安全性 3.5 常见网络应用的要求 4. 因特网提供的传输服务…

ArcGIS基础实验操作100例--实验69布局中添加报表和Excel图表

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验69 布局中添加报表和Excel图表 目录 一、实验背景 二、实验数据 三、实验步骤 &…

最快的表格:Dapfor Wpf GridControl

Dapfor Wpf GridControl 特性Wpf GridControl 是我们网格的第三个版本&#xff0c;它基于 WPF 技术。前两个产品是基于Microsoft WinForms 技术的MFC Grid 和.Net Grid。在网格的第三次迭代中&#xff0c;Dapfor 的专家采用了以前产品的最佳功能&#xff0c;从而产生了比其他供…

(4)go-micro微服务proto开发

文章目录一 Protobuf介绍二 安装Protobuf三 Protobuf语法1.1 基本规范1.2 字段规则1.3 service如何定义1.4 Message如何定义四 proto代码编写五 生成.go文件六 最后一 Protobuf介绍 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准&#xff0c;…

微信小程序开发笔记 基础篇③——自定义数据dataset,事件触发携带额外信息

文章目录一、前文二、视频演示三、原理和流程四、注意事项五、全部源码六、参考一、前文 想要实现一个电费充值界面。多个不同金额的充值按钮&#xff0c;每个按钮都携带自定义数据&#xff08;金额&#xff09;点击不同金额的充值按钮&#xff0c;就会上传对应的数据&#xf…

ssh无法登录Centos9解决方法

环境&#xff1a;Centos Stream release 9 情况&#xff1a;通过ssh方式&#xff0c;不管本地登录localhost还是远程登录&#xff0c;均失败。 尝试关闭firewalld和selinux&#xff0c;也不起作用。经搜索和尝试&#xff0c;需要修改/etc/ssh/sshd_config的PermitRootLogin的参…

Cpp20入门0:使用模块输出HelloWorld (import module)

时间&#xff1a;2023.1.8 视频地址&#xff1a;C20要不要学&#xff1f;&#xff1f;&#xff1f;_哔哩哔哩_bilibili 目录 一、Cpp20_HelloWorld ​编辑 头文件 Module.ixx 源文件 main函数 0.Cpp20_HelloWorld.cpp 二、Cpp20 main直接import 三、visual studio 快捷…

C语言银行管理系统

程序示例精选 C语言银行管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C语言银行管理系统>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

指针进阶版☞(超easy~)

回顾初级指针&#xff1a;http://t.csdn.cn/5tCSr &#xff08;其中包含指针和指针数组&#xff09; 接下来的内容是进阶新知识点哟 (&#xff3e;&#xff35;&#xff3e;)ノ~&#xff39;&#xff2f;一.字符指针o(*&#xffe3;▽&#xffe3;*)ブ1.常量字符的指针。对于常…

STL-vector容器和string容器

目录 一、STL的基本概念 二、vector容器 1.遍历 2.vector存放自定义数据类型 3.容器嵌套容器 4.构造函数 5.容量和大小 6.插入和删除 7.容器互换 三、string容器 1.string和char的区别 2.string的构造函数 3.赋值操作 4.字符串拼接 5.查找和替换 6.比较 7.字符串的存取和单个字…

Linux应用编程---5.多线程的创建以及线程间数据共享

Linux应用编程—5.多线程的创建以及线程间数据共享 5.1 多线程的创建 ​ 创建多线程&#xff0c;则多次调用pthread_create()函数。创建两个线程&#xff0c;线程1每隔一秒打印字符串&#xff1a;Hello world&#xff01;&#xff0c;线程2每隔一秒打印字符串&#xff1a;Goo…

【目标检测】Casecade R-CNN论文讲解(超详细版本)

目录&#xff1a;Casecade R-CNN论文讲解一、背景二、简单回顾R-CNN结构2.1 Training阶段2.2 Inference阶段三、论文摘要四、介绍五、关于mismatch问题六、关于单纯增大训练时IoU阈值问题七、相关工作7.1 two-stage7.2 one-stage7.3 multi-stage八、Cascade R-CNN讲解九、总结论…