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 相关文章推荐
cssQuery()的下载与使用方法
Jan 12 Javascript
常见JS效果之图片减速度滚动实现代码
Dec 08 Javascript
jQuery点击弹出下拉菜单的小例子
Aug 01 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
Mar 19 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
深入浅析AngularJS和DataModel
Feb 16 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
Nov 29 Javascript
关于Webpack dev server热加载失败的解决方法
Feb 22 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
深入理解Vue 的钩子函数
Sep 05 Javascript
深入理解javascript prototype的相关知识
Sep 19 Javascript
Vue实现数据请求拦截
Oct 23 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+redis实现的悲观锁机制示例
2018/06/12 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
JavaScript Prototype对象
2009/01/07 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
js replace()去除代码中空格的实例
2017/02/14 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
生物科学专业个人求职信范文
2013/12/07 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2014年政协工作总结
2014/12/09 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
大学生实习证明
2015/06/16 职场文书
推普标语口号大全
2015/12/26 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
简单谈谈Python面向对象的相关知识
2021/06/28 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技