JavaScript面试技巧之数组的一些不low操作


Posted in Javascript onMarch 22, 2019

前言

本文主要从应用来讲数组api的一些骚操作;

如一行代码扁平化n维数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等;

上面这些应用场景你可以用一行代码实现?

1.扁平化n维数组

1.终极篇

[1,[2,3]].flat(2) //[1,2,3]
[1,[2,3,[4,5]].flat(3) //[1,2,3,4,5]
[1,[2,3,[4,5]]].toString() //'1,2,3,4,5'
[1[2,3,[4,5[...]].flat(Infinity) //[1,2,3,4...n]

Array.flat(n)是ES10扁平数组的api,n表示维度,n值为Infinity时维度为无限大

2.开始篇

function flatten(arr) {
 while(arr.some(item=>Array.isArray(item))) {
 arr = [].concat(...arr);
 }
 return arr;
}
flatten([1,[2,3]]) //[1,2,3]
flatten([1,[2,3,[4,5]]) //[1,2,3,4,5]

实质是利用递归和数组合并方法concat实现扁平

2.去重

1.终极篇

Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4]
[...new Set([1,2,3,3,4,4])] //[1,2,3,4]

set是ES6新出来的一种一种定义不重复数组的数据类型

Array.from是将类数组转化为数组

...是扩展运算符,将set里面的值转化为字符串

2.开始篇

Array.prototype.distinct = function(){
 var arr = this,
 result = [],
 i,
 j,
 len = arr.length;
 for(i = 0; i < len; i++){
 for(j = i + 1; j < len; j++){
 if(arr[i] === arr[j]){
 j = ++i;
 }
 }
 result.push(arr[i]);
 }
 return result;
}
[1,2,3,3,4,4].distinct(); //[1,2,3,4]

取新数组存值,循环两个数组值相比较

3.排序

1.终极篇

[1,2,3,4].sort((a, b) => a - b); // [1, 2,3,4],默认是升序
[1,2,3,4].sort((a, b) => b - a); // [4,3,2,1] 降序

sort是js内置的排序方法,参数为一个函数

2.开始篇

冒泡排序:

Array.prototype.bubleSort=function () {
 let arr=this,
 len = arr.length;
 for (let outer = len; outer >= 2; outer--) {
 for (let inner = 0; inner <= outer - 1; inner++) {
 if (arr[inner] > arr[inner + 1]) {
  //升序
  [arr[inner], arr[inner + 1]] = [arr[inner + 1], arr[inner]];
  console.log([arr[inner], arr[inner + 1]]);
 }
 }
 }
 return arr;
 }
[1,2,3,4].bubleSort() //[1,2,3,4]

选择排序

Array.prototype.selectSort=function () {
 let arr=this,
  len = arr.length;
 for (let i = 0, len = arr.length; i < len; i++) {
 for (let j = i, len = arr.length; j < len; j++) {
 if (arr[i] > arr[j]) {
 [arr[i], arr[j]] = [arr[j], arr[i]];
 }
 }
 }
 return arr;
 }
 [1,2,3,4].selectSort() //[1,2,3,4]

4.最大值

1.终极篇

Math.max(...[1,2,3,4]) //4
Math.max.apply(this,[1,2,3,4]) //4
[1,2,3,4].reduce( (prev, cur,curIndex,arr)=> {
 return Math.max(prev,cur);
},0) //4

Math.max()是Math对象内置的方法,参数是字符串;

reduce是ES5的数组api,参数有函数和默认初始值;

函数有四个参数,pre(上一次的返回值),cur(当前值),curIndex(当前值索引),arr(当前数组)

2.开始篇

先排序再取值

5.求和

1.终极篇

[1,2,3,4].arr.reduce(function (prev, cur) {
 return prev + cur;
 },0) //10

2.开始篇

function sum(arr) {
 var len = arr.length;
 if(len == 0){
 return 0;
 } else if (len == 1){
 return arr[0];
 } else {
 return arr[0] + sum(arr.slice(1));
 }
}
sum([1,2,3,4]) //10

利用slice截取改变数组,再利用递归求和

6.合并

1.终极篇

[1,2,3,4].concat([5,6]) //[1,2,3,4,5,6]
[...[1,2,3,4],...[4,5]] //[1,2,3,4,5,6]
[1,2,3,4].push.apply([1,2,3,4],[5,6]) //[1,2,3,4,5,6]

2.开始篇

let arr=[1,2,3,4];
[5,6].map(item=>{
 arr.push(item)
}) //arr值为[1,2,3,4,5,6],注意不能直接return出来,return后只会返回[5,6]

7.判断是否包含值

1.终极篇

[1,2,3].includes(4) //false
[1,2,3].indexOf(4) //-1 如果存在换回索引
[1, 2, 3].find((item)=>item===3)) //3 如果数组中无值返回undefined
[1, 2, 3].findIndex((item)=>item===3)) //2 如果数组中无值返回-1

includes(),find(),findIndex()是ES6的api

2.开始篇

[1,2,3].some(item=>{
 return item===3
}) //true 如果不包含返回false

8.类数组转化

1.终极篇

Array.prototype.slice.call(arguments) //arguments是类数组(伪数组)
Array.prototype.slice.apply(arguments)
Array.from(arguments)
[...arguments]

类数组:表示有length属性,但是不具备数组的方法

call,apply:是改变slice里面的this指向arguments,所以arguments也可调用数组的方法

Array.from是将类似数组或可迭代对象创建为数组

...是将类数组扩展为字符串,再定义为数组

2.开始篇

Array.prototype.slice = function(start,end){ 
 var result = new Array(); 
 start = start || 0; 
 end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键 
 for(var i = start; i < end; i++){ 
  result.push(this[i]); 
 } 
 return result; 
 }

9.每一项设置值

1.终极篇

[1,2,3].fill(false) //[false,false,false]

fill是ES6的方法
2.开始篇

[1,2,3].map(() => 0)

10.每一项是否满足

[1,2,3].every(item=>{return item>2}) //false

every是ES5的api,每一项满足返回 true

11.有一项满足

[1,2,3].some(item=>{return item>2}) //true

some是ES5的api,有一项满足返回 true

12.过滤数组

[1,2,3].filter(item=>{return item>2}) //[3]

filter是ES5的api,返回满足添加的项的数组

13.对象和数组转化

Object.keys({name:'张三',age:14}) //['name','age']
Object.values({name:'张三',age:14}) //['张三',14]
Object.entries({name:'张三',age:14}) //[[name,'张三'],[age,14]]
Object.fromEntries([name,'张三'],[age,14]) //ES10的api,Chrome不支持 , firebox输出{name:'张三',age:14}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
jquery ui dialog实现弹窗特效的思路及代码
Aug 03 Javascript
Node.js编码规范
Jul 14 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
Bootstrap按钮下拉菜单组件详解
May 10 Javascript
vue.js指令和组件详细介绍及实例
Apr 06 Javascript
jQuery遮罩层实例讲解
May 11 jQuery
jQuery Migrate 插件用法实例详解
May 22 jQuery
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
解决ant Design Search无法输入内容的问题
Oct 29 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
Mar 22 #Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 #Javascript
使用node搭建自动发图文微博机器人的方法
Mar 22 #Javascript
如何从零开始手写Koa2框架
Mar 22 #Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
Mar 22 #Javascript
详解ES6中的Map与Set集合
Mar 22 #Javascript
js控制随机数生成概率代码实例
Mar 21 #Javascript
You might like
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
StringTemplate遇见jQuery冲突的解决方法
2011/09/22 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
javascript history对象详解
2017/02/09 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
Vue点击切换颜色的方法
2018/09/13 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
python中MethodType方法介绍与使用示例
2017/08/03 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
详细分析Python collections工具库
2020/07/16 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
优秀中专生推荐信
2013/11/17 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
科技工作者先进事迹
2014/08/16 职场文书
2014年超市工作总结
2014/11/19 职场文书
2014年社团工作总结范文
2014/11/27 职场文书
计划生育工作总结2015
2015/04/03 职场文书
团组织推荐意见
2015/06/05 职场文书
Django操作cookie的实现
2021/05/26 Python
Java集成swagger文档组件
2021/06/28 Java/Android