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 相关文章推荐
js中设置元素class的三种方法小结
Aug 28 Javascript
JavaScript数组去重的3种方法和代码实例
Jul 01 Javascript
详解AngularJS如何实现跨域请求
Aug 22 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
整理关于Bootstrap导航的慕课笔记
Mar 29 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
js实现倒计时器自定义时间和暂停
Feb 25 Javascript
JavaScript实现随机五位数验证码
Sep 27 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 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 函数中使用static的说明
2012/06/01 PHP
PHP中的替代语法介绍
2015/01/09 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
javascript:void(0)使用探讨
2013/08/27 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python去除所有html标签的方法
2015/05/05 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
如何完美的建立一个python项目
2020/10/09 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
成人大专生实习期的自我评价
2013/10/02 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
我的1919观后感
2015/06/03 职场文书
单位同意报考证明
2015/06/17 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
Python之matplotlib绘制折线图
2022/04/13 Python