【Array数组】面试前基础知识点深度记忆总结

news2024/11/24 11:29:13

写本篇博客的原因是发现有人遇到了以下误区,

1、在我面试别人的过程中,我想让他说一下数组的一些内置方法和含义,然后他条例思路不太清晰,跳动着说,所以遗漏了很多,或许按照es5到es6是一个指导顺序,或者先说对数组的删除,插入,再说到遍历这个顺序;

2、我问了一下filter,如果不用filter或者之前没有filter的时候,应该怎么实现一下filter的这个方法,貌似之前没有准备这块,其实也可能是filter用的不多;

3、我之前好像看过一篇博客,写的如果再用for循环,就要扇自己之类的,其实大可不必如此,我觉得我们之中很多人还没有强大到的鄙视某一项技术点的时候吧,想扇就扇自己几下吧,我们也看不见。

 

目录

1、filter 查找非 es6实现

2、every 判断的 非es6实现

3、some 判断的 非es6 实现 

4、find查找的 非es6 实现 

5、请为数组自定义一个方法 myFn ,实现 find 的方法

6、请说一说js中数组的常用内置方法

7、你现在遍历数组,还用for循环吗?


1、filter 查找非 es6实现

filter是通过遍历数组的所有元素,查找到符合过滤条件的元素,并且返回符合条件元素的集合。如果没有找到匹配的元素,那么返回的就是空数组,也就是返回的数组长度为0.代码如下:

var arr = [12, 33, 88, 66, 22];
var returnArr = arr.filter((item, index, arr) => {
    console.log(index + '  循环过程  ' + item);
    return item > 50;
})
console.log('得到的returnArr::', returnArr);

 

非ES6的实现,代码如下:

var returnArr = [];
for (var i=0;i<arr.length;i++) {
    if (arr[i] > 50) {
      returnArr.push(arr[i]);
     }
}
console.log(returnArr);

可以看出,filter相当于重新定义了一个空数组,对原数组进行了一次完整的遍历。需要注意的是filter是一次完整的遍历,数组长度是多少就要执行多少次,如果不是这种场景,可以考虑其他的执行方法。

2、every 判断的 非es6实现

every是对原数组进行遍历判断,every更强调每一个,遍历执行过程中,一旦某一个不符合过滤判断条件,将会直接跳出循环,不再继续执行循环,返回值是false,所以,every返回的是boolean值,代码如下:

var arr = [12, 33, 88, 66, 22];
var returnPause = arr.every((item, index, arr) => {
   console.log(index + '  循环过程  ' + item);
   return item > 50;
})
console.log('得到的returnPause::', returnPause);

 

可见every是一个返回boolean值得执行过程,而且他强调每一个是否符合判断条件。 

非ES6的实现,代码如下: 

var returnPause = true;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] <= 50) {
      returnPause = false;
      break;
   }
}
console.log(returnPause);

而非es6的实现明显判断条件和every的判断条件正好相反,同时every对for循环的break及时跳出循环做了一层封装。 

3、some 判断的 非es6 实现 

some和every更强调如果有,就返回true,及时跳出,不再继续执行循环。这里也是对break的一个封装。可以说在日常工作中,数组的元素可能非常多,如果不能及时做出break跳出,将会非常耗费性能。some的代码如下:

var arr = [12, 33, 88, 66, 22];
var returnPause = arr.some((item, index, arr) => {
     console.log(index + '  循环过程  ' + item);
     return item > 50;
})
console.log('得到的returnPause::', returnPause);

而非es6的实现代码如下: 

var returnPause = false;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] > 50) {
       returnPause = true;
       break;
   }
}
console.log(returnPause);

与every相反,这里提前定义的返回结果为false,而some的提前定义结果为true。 

4、find查找的 非es6 实现 

find强调查找到的第一个元素,一旦找到符合条件的元素,将会跳出循环,不再继续执行,代码如下:

var arr = [12, 33, 88, 66, 22];
var returnArr = arr.find((item, index, arr) => {
    console.log(index + '  循环过程  ' + item);
    return item > 50;
})
console.log('得到的returnArr::', returnArr);

可见,find查找也是找到后及时跳出循环,并且他返回的是某个元素,而非一个集合。

非es6的实现:

var returnItem = 0;
for (var i=0;i<arr.length;i++) {
   console.log(i);
   if (arr[i] > 50) {
       returnItem = arr[i];
       break;
   }
}
console.log(returnItem);

以上4种查找方式更符合非准确查找案例,我们已知的是一个不太准确的消息,例如众多元素中是否有符合某种条件的元素存在,而非准确的说众多元素中是否有谁谁谁必须考了88分钟这样。

5、请为数组自定义一个方法 myFn ,实现 find 的方法

面试的时候,让当场自定义一个方法,去实现一些es6中新的方法,也是很常见的一种案例。上面我们已经知道了find的作用和他的本质实现,现在来自定义一个myFn,用来实现和find相同的需求逻辑,代码如下:

Array.prototype.myFn = function() {
   var myArr = this;
   var returnItem = 0;
   for (var i=0;i<myArr.length;i++) {
      if (myArr[i] > 50) {
        returnItem = myArr[i];
        break;
      }
   }
   return returnItem;
}
var returnValue = arr.myFn();
console.log('所得结果::', returnValue);

面试的时候,可能面试官知道你练习过怎么自定义一个方法,他其实是在看你有没有注意break关键字的使用。

6、请说一说js中数组的常用内置方法

我建议你可以这样回答:

在日常工作之余呢,我也有总结过,因为他的内置方法太多了,很容易记混;

△ 首先,有对数组删除和插入操作的,例如

push(向尾部添加元素)这个方法返回的是新数组的长度
pop(删除数组尾部的一个元素)这个方法返回的是删除的元素
unshift(向数组开头添加元素)这个方法返回的是新数组的长度
shift(删除数组的第一个元素)这个方法返回的是删除的元素
splice(从数组的某个位置删除元素,还可以选择是否添加元素,添加几个)这个方法没有返回值,只是单纯的操作数组
concat(链接2个或者更多的数组)这个方法现在我比较习惯用es6的解构...来添加了

△  非常常用的转字符串的方法,例如

toString方法这个方法可以将数组转为字符串,相当于join方法没有入参
join这个方法可以按照一定的规则将数组转为字符串

△  然后是返回数组的元素索引和截取

indexOf和字符串的方法类似,返回某个元素的第一次出现的索引值
lastIndexOf这个方法和indexOf相反,是返回最后一次出现的索引值
slice截取知道了indexOf方法后,就可以对数组进行一定的截取工作,所以我把这2个方法放在一起记忆

△ 数组的循环和判断

for循环并不是数组的内置方法但很多时候我还是比较喜欢这个方法的,因为很多新的方法其实封装了for循环
forEach循环但其实forEach并不能实现break和continue,这是我不太喜欢的,如果不需要这2个的需求逻辑,我会用forEach循环
some和every这2个方法都是合理利用break的体现
filter过滤这个方法会按照过滤条件,将循环整体走一遍,最后返回的是一个数组集合
find查找这个方法最终找到第一个符合条件的元素就break了,返回的是一个元素

△ 比较常用的还有累积计算的方法

reduce方法这个方法是将元素累积做计算,例如累加

可以说数组的内置方法还是比较多的,比较乱套。所以,不做一次整理,一旦面试的时候问起来很容易回答的很乱套,一旦乱套了,自己知道的东西也就忘记了。 

7、你现在遍历数组,还用for循环吗?

回答:用,很多人觉得for循环很low,不应该再用for循环了,其实我还远没有达到鄙视某个知识点的地步。如果某个需求涉及到对数组整体进行一次遍历,那么我会用forEach来遍历,但如果涉及到查找某到某一个元素就要及时跳出,我还是会采用for循环加break关键字的。

虽然some和every有时候也能满足,但我觉得他们也是对for循环的一个封装,不如for循环本身实现快速。而且for循环的兼容性更好一些。 

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

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

相关文章

51单片机——独立按键实验,小白讲解,相互学习

按键介绍&#xff1a; 按键是一种电子开关&#xff0c;使用时轻轻按开关按钮就可式开关接通&#xff0c;当松手时&#xff0c;开关断开。开发板上使用的按键及内部简易图如下图&#xff1a; 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xf…

Pandas-根据数据表1中的字段a,筛选出数据表2中也包含字段a的数据

前言 本文是该专栏的第18篇,后面会持续分享python的数据分析知识,记得关注。 假设现在有个数据分析的需求,如下: 数据表1中有几十万条数据,数据表2中有几万条数据,两张数据表1和2有两个相同的字段phone,现在需要将数据表1和数据表2中,phone字段存在相同的行,保留下来…

redis集群操作

Redis集群1 集群2 集群架构图3 集群细节4 集群搭建4.1.创建集群4.2.查看集群状态4.3.添加主节点4.4.添加从节点4.5.删除副本节点4.6.集群在线分片1 集群 Redis在3.0后开始支持Cluster(模式)模式&#xff0c;目前redis的集群支持节点的自动发现&#xff0c;支持slave-master选举…

Nmap系统扫描实战

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是Nmap系统扫描实战。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

解决Win系统cad激活安装失败问题,AutoCad 2022 中文/英文正式详细安装教程

Autodesk AutoCAD 2022简称“cad 2022”是一款功能强大的CAD三维绘图辅助设计软件。autocad 2022适用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;广泛应用于机械设计、工业制图、工程制图、土木建筑、装饰装潢、服装加工等多个行业领域。CAD2022新特征&#xff…

线径看板帮助电线电缆厂提高生产效率的工作原理

当今&#xff0c;市场上出现了越来越多的电线电缆品牌&#xff0c;电线电缆市场的竞争越来越激烈&#xff0c;电线厂家稍有不慎&#xff0c;出现了产品不规范、不合格的异常情况&#xff0c;就很可能会被市场淘汰&#xff0c;被消费者所抛弃。那么&#xff0c;要怎样才能够保障…

MVC(Model,View,Controller)

MVC是指Model&#xff08;模型层&#xff0c;数据&#xff09;&#xff0c;View&#xff08;视图层),Controller(控制层&#xff09; 核心是DispathcherServlet&#xff08;一个Servlet&#xff09; (1) 客户端的请求提交给DispathcherServlet (2&#xff09;DispathcherServl…

【动态规划篇】斐波那契数列拆分词句三角矩阵

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

基于Java(JSP+Servlet)+Mysql实现的(Web)简易的工资管理系统【100010062】

1.问题描述 一个公司下分为若干部门&#xff0c;每个部门有若干职员和经理&#xff0c;每个部门经销若干种商品。工资由基本工资、产品销售业绩奖、若干种保险的扣除等组成。其中的销售业绩奖按以下方式设计&#xff1a;职员按其完成额的 5% 提成&#xff0c;经理按其部门完成…

string.IsNullOrEmpty和string.IsNullOrWhiteSpace的区别

string.IsNullOrEmpty和string.IsNullOrWhiteSpace 本人一直使用的是string.IsNullOrEmpty方法来判断字符串是否为空. 在插件中发现另外一种写法&#xff1a; string s1 null; string s2 string.Empty; string s3 ""; strin…

精通MyBatis原理,看这两篇就够了!(二)

本文是关于MyBatis源码的第二篇&#xff0c;解读了MyBatis的核心执行SQL流程&#xff0c;对源码做了详细注释。内容较长&#xff0c;推荐电脑阅读。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达执行阶段流程第一篇文章讲解了Mybatis启动…

【jdk11+jprofiler 11进行java程序性能调优案例之--内存溢出原因分析】

1.安装jprofiler jprofiler_windows-x64_11_0_2.exe 2.使用KeyGen.exe生成注册码然后输入 3.idea中安装jprofiler插件 File-->Setting-->Plugins 搜索jprofiler插件然后安装 4.以一个内存溢出的程序为例子进行分析(一直分配内存&#xff0c;List容器引用着Student导致…

Java创建线程的三种方式

Java创建线程的三种方式 一、通过Thread类的方式进行创建 步骤&#xff1a; 1、创建Thread的子类&#xff0c;重写run方法&#xff0c;run方法就表示线程需要完成的任务 2、创建Thread实例&#xff0c;也就是创建线程对象 3、使用start来启动线程&#xff08;线程启动的唯一方…

显著性分析

选择图 为什么要分Non-parametric & parametric 方法 为了找到更符合数据的分析方法。每个方法有自己的假设&#xff0c;如果违背了结果会不精准。 Sign Test 是一个可以用于任何数据分布情况的pairwise 方法。 检查normality: Sample 数量 < 50,适用 Shapiro-Wilk&am…

【Kotlin 协程】Flow 操作符 ① ( 过渡操作符 | map 操作符 | transform 操作符 | 限长操作符 | take 操作符 )

文章目录一、过渡操作符1、map 操作符2、transform 操作符二、限长操作符 ( take 操作符 )一、过渡操作符 过渡操作符 相关概念 : 转换流 : 使用 过渡操作符 转换 Flow 流 ;作用位置 : 过渡操作符作用 于 流的上游 , 返回 流的下游 ;非挂起函数 : 过渡操作符 不是挂起函数 , 属…

大话JMeter2|正确get参数传递和HTTP如何正确使用

上节课展示了JMeter的基础用法&#xff1a;录制回放功能&#xff0c;断言&#xff0c;聚合报告。但是在无UI下如何进行接口的访问呢&#xff1f;如何正确get参数传递和HTTP如何正确使用。尤其是在无UI下进行接口的访问。小哥哥带着你用漫画来学习JMeter&#xff0c;让你在轻松的…

【MMAsia 2021】Patch-Based Deep Autoencoder for Point Cloud Geometry Compression

文章目录Patch-Based Deep Autoencoder for Point Cloud Geometry Compression压缩流程自编码架构实验结果Patch-Based Deep Autoencoder for Point Cloud Geometry Compression https://arxiv.org/abs/2110.09109 这篇论文使用深度自编码器&#xff0c;提出了一种基于分块&am…

发票识别OCR及查验API接口为企业化解难题

对于当今的现代企业来说&#xff0c;分散的财务管理模式效率不高&#xff0c;管理成本反而相对较高&#xff0c;制约了集团企业发展战略的实施&#xff0c;因而需要建设财务共享模式。一个企业要建成财务共享中心&#xff0c;面临的难题是大量的数据采集和信息处理工作&#xf…

一组类型相同的数据【C 数组】总结

作者 &#xff1a; 会敲代码的Steve 墓志铭&#xff1a;博学笃志 切问静思 前言&#xff1a;本文旨在复习C语言数组章节的知识点、分为以下几个部分&#xff1a; 什么是数组一维数组、一维数组的初始化、一维数组的遍历、冒泡排序。二维数组、二维数组的创建和初始化、二维数…

多功能采集仪VH03接口使用说明

传感器接口 传感器接口须使用设备专门配备的测线&#xff0c;一端为 DB9 一端为用颜色区分的多个鳄鱼夹&#xff0c;线&#xff08;鳄鱼夹&#xff09;颜色和功能定义详见“设备组成和接口定义” 。 充电和通讯接口 VH03 使用标准的 USB Type-C 接口完成设备充电和通讯&…