当清晨的第一缕阳光,映照在我脸庞。犹如一双饱含温情的手抚摸着抚摸着,我便起了床。雨水洗刷过的街道,弥漫着沁人心脾的清香。 街边早餐铺的油条在锅中滋滋发出声响,我知道这根热气腾腾新鲜出炉的油条,过一下子将会去到下一个地方。我三两口就送它去了(就像B站美食up主徐大sao在重庆时的狠话二两面我两口就吃完了)我便来到了早晨的第一个打卡点,地铁站🚞。车箱内真是人山人海挨肩擦背一点都不夸张,有时停站耳边也会传来工做人员的呐喊声(挤嘛,这儿还能够qi一个)下了车也是人头攒动步履艰辛。在车箱里结伴同行的人不多,你们都习惯低着头看着手机这让我想起了一句话抬头看见梦想,低头却遇见了现实我也闭上了双眼开始陷入沉思🤔,JS的数组api中属于遍历的有不少,它们各司其职。可是真正的使用场景是什么?哪个在场景中性能更高,更快?便有了下文。css
有看面试相关的小伙伴能够浏览下好朋友正在火热筹划中的 面试汇总库💪html
若文章中的解答有误,但愿可以获得小伙伴们的指正与谅解。但愿能和你来一场知识的碰撞。react
在计算以前,我须要一个计算运行时间函数,和一个实验测试数组arrgit
function calcTime (func) {
let start = new Date().getTime(); //开始时间
func(); //执行待测函数
var end = new Date().getTime(); //结束时间
return (end - start)+ "ms"; //返回函数执行须要时间
}
let arr = [] // 建立一个我须要的测试数据
for(let i=0;i<1000000;i++) {
arr.push(i)
}
复制代码
find() 方法返回数组中知足提供的测试函数的第一个元素的值。不然返回 undefined。github
我如今有一个需求,从一个数组中,找出指定项。面试
// 使用find前
function foo(){
for(let i=0;i<arr.length;i++){
if(arr[i] === 50000) return;
}
}
//使用find后
function findFoo(){
arr.find( item => item === 50000)
}
calcTime(foo) // 16ms
calcTime(findFoo) // 1ms find更优
复制代码
本次实验环境是在JSBin保证了环境相同,设备相同,情景相同,全部实验结果都会会根据你的电脑性能给出不一样值。因此不要考虑绝对值,参考点是在相对值👆。后端
forEach() 方法对数组的每一个元素执行一次提供的函数。api
map() 方法建立一个新数组,其结果是该数组中的每一个元素都调用一个提供的函数后返回的结果。数组
为了不JSBin崩溃,本次arr长度为1wbash
function foo(){
for(let i=0;i<arr.length;i++){
for(let j=0;j<arr.length;j++){}
}
}
// 使用forEach
function foreachFoo(){
arr.forEach(()=>{
arr.forEach(()=>{})
})
}
// 使用map
function fooMap(){
arr.map(()=>{
arr.map(()=>{})
})
}
calcTime(foo) // 39ms
calcTime(foreachFoo) // 649ms
calcTime(foreachMap) // 699ms for()更优
复制代码
filter() 方法建立一个新数组, 其包含经过所提供函数实现的测试的全部元素。本次arr长度10w
function foo(){
let newArr =[]
for(let i=0;i<arr.length;i++){
if(arr[i]>=50000){
newArr.push(arr[i])
}
}
}
// 使用filter
function filterFoo(){
letnewArr = arr.filter(item=> item>=50000 )
}
calcTime(foo) // 59ms
calcTime(filterFoo) // 4ms filter更优
复制代码
reduce() 方法对数组中的每一个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
function foo(){
let sum = 0
for(let i=0;i<arr.length;i++){
sum = sum + arr[i]
}
}
// 使用reduce
function reduceFoo(){
arr.reduce((sum,item)=>sum +item)
}
calcTime(foo) // 57ms
calcTime(reduceFoo) // 4ms reduce更优
复制代码
经过简单的几个对比,能够知道数组中创造filter,find,reduce都是有目的。仍是俗话说的好,术业有专攻。咱们做为开发者首先应该知道每一个api的做用,而后考虑本身的业务场景选择最佳的方法。 举个🌰
之前的写法:
iconFliter(num){
if(num>0 && nun<=30){
return 'normal'
}
if(num>30 && nun<=100){
return 'orange'
}
if(num>100 && nun<=250){
return 'yellow'
}
if(num>250){
return 'red'
}
复制代码
这样写并无问题,可是咱们能够仔细思考下,咱们能够借用现有的数据结构(对象,数组)他们的特色来完成,以下
// 业务中独立的变量转化成数组和对象结构
let datas = [{time:30,color:'normal'},{time:100,color:'orange'},{time:250,color:'yellow'}]
// 再经过高效的api进行处理
function iconFilter(num,data) {
if (num<0) return
let selectData = data.find(item => num <= item.time)
return selectData ? selectData.color:'red'
}
复制代码
只要多思考,代码确定会越写越好。
方法名 | 描述 |
---|---|
some | 检测数组元素中是否有元素符合指定条件 |
every | 检测数值元素的每一个元素是否都符合条件。 |
includes | 判断一个数组是否包含一个指定的值。 |
方法名 | 描述 |
---|---|
push | 向数组的末尾添加一个或更多元素,并返回新的长度 |
pop | 删除数组的最后一个元素并返回删除的元素 |
unshift | 向数组的开头添加一个或更多元素,并返回新的长度 |
shift | 删除并返回数组的第一个元素 |
reverse | 反转数组的元素顺序 |
splice | 从数组中添加或删除元素 |
sort | 对数组的元素进行排序 |
剩下的方法就是不改变原数组的方法
平时业务中常常会对后端小伙伴返回的数组对象进行处理,此时我须要将citizenship(国籍)为china的对象属性name换成chineseName,新增一个属性location值为Asian,国籍为america也要进行操做,你会怎么作?以下所示吗?平时你就是这种写的吗?
let datas = [{name:'张大娃',age:19,sex:'boy',citizenship:'china'},
{name:'张老二',age:35,sex:'boy',citizenship:'china'},
{name:'赵二娃',age:21,sex:'boy',citizenship:'china'},···]
datas.forEach(item=>{
if(item.citizenship === 'china'){
item.chineseName = item.name
item.location = 'Asian'
}else if (item.citizenship === 'America') {
item.americaName = item.name
item.location = 'northAmerica'
}
})
复制代码
但愿你能帮我优化一下上面的代码
立刻就要打下班卡领取周末了,祝你们周末愉快每天开💓