分成以下两类:会改变原数组的和不会改变原数组的
一、会改变原数组的
1 .sort()
之前写过一篇 点击这里查看
二、不会改变原数组的
- concat
连接两个数组,并且返回一个新数组
var arr = [1,2,32,23,4,2,2,2]
var arr2 = [6,7,8]
var c = arr.concat(arr2)
console.log(c) // [1, 2, 32, 23, 4, 2, 2, 2, 6, 7, 8]
如果是传一个空数组,那么会复制原来的数组,并且返回一个新数组;如果不加[ ],直接在里面写arr.concat(1,2,3),和写一个数组进去是一样的效果,估计是浏览器自动纠错的功能
这个不算高阶。。。
- map和forEach
map有地图的意思,还有映射的意思,可以这样理解,地图上的每一个点在真实世界里面都有一个对应的映射。
在map和forEach这些数组的方法里面,会传进去一个函数作为map方法的一个参数,这个函数里面的第一个参数指的是数组的value,第二格参数指的是数组的key,有时也会有第三个参数,指的是数组本身。
如下函数是map的一个用法
let score = [29,50,62,95,59]
let result = score.map(function(x,y){
return x >= 60 ? '及格':'不及格'
})
console.log(result) // ["不及格", "不及格", "及格", "及格", "不及格"]
上面的map返回的是三元运算符的结果
var arr = [1,2,32,23,4,2,2,2]
var c = arr.map(function(x,y){
return x*2
})
console.log(c) // [2, 4, 64, 46, 8, 4, 4, 4]
可以确定的是map会使遍历原数组,需要一个变量来接住map运算产生的结果,并且原数组是不会改变的。
阮一峰的教程上是这样解释的:
map方法对数组的所有成员依次调用一个函数,根据函数结果返回一个新数组。
map和forEach类似,区别是map会返回一个数组,内置的函数会传三个参数,第一个是value,第二个是key,第三个是这个数组本身,如果单纯的return 第三个参数,那么会打印length次,因为内部会循环length次。而forEach则不会返回。
下面来一个forEach的例子
let score = [29,50,62,95,59]
score.forEach(function(x,y){
console.log(x*2) // 29, 50, 62, 95, 59 在控制台上分行显示
})
console.log(score) // [29, 50, 62, 95, 59]
forEach方法默认不会生成一个新数组,它是针对数组进行某项操作,最后的return 的结果是undefined
但是,也可以稍微改装一下,让它和map变成一样的结果,也可以间接地返回一个数组,但是仍然是有区别的
let score = [29,50,62,95,59]
let c = []
score.forEach(function(x,y){
c.push(x * 2)
})
console.log(c) // [58, 100, 124, 190, 118]
- filter
和map类似,return 一个结果,返回符合这个结果的所有值
var arr = [1,2,32,23,4,2,2,2]
var c = arr.filter(function(x,y){
return x % 2 == 0
})
console.log(c) // [1, 32, 4, 2]
filter本身有过滤的意思,它只会返回符合条件的结果,并且把这个结果扔进一个数组
- reduce
var arr = [1,2,3,1,2,2,2,1,2]
console.log(arr.reduce(function(x,y){
return x +y
},0)) // 16
reduce会在函数后再跟一个参数,默认从这个参数开始计算,用来接收每次遍历计算出来的结果,上面的结果是表示从0开始,计算arr这个数组的和。如果return是用来计算乘法的,后面就用1来接收;也可以一个用空数组来接收。y代表当前值,x代表之前的一个值、一般都是代表用来做每次遍历接收值用的数。
上面的代码全部都是用x和y之类的作为变量名,把他们都换一个名字,就比较好理解了。
var arr = [1,2,3]
let a = arr.reduce(function(temp,item,index){
return temp + item
},0)
console.log(a)
reduce里面的函数有三个参数,第一个参数是运算时的中间变量,第二个参数是数组里面的value,第三个是数组的下标。
在运算时,内部会像一个递归一样,执行多次,temp的初始值默认是undefined,也可以给它一个初始值,就像上例一样,在初始值处给它0,后面就递归的完成temp = temp + item
的计算,计算完成后temp被返回出去。
比喻一下,范伟在打劫的时候,手上会拿一个袋子,这时候他说:“打打打打打... 劫,ip 、ic 、IQ卡,统统告诉我密码”,然后,他就拿着这个袋子去收东西,这个袋子,就是中间变量temp,默认里面是没有的(undefined),当然,范伟也可能会把自己的钱包放里面(函数后面再给一个数),范伟会往车厢里面走,别人的卡会依次被他收进袋子里面,收到最后最后一个人,就是最终范伟打劫所得的财产
再练习一个reduce
求下面这个数组里面奇数的和
let arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
如下:
let arr2 = arr1.reduce(function(temp, value){
if(value % 2 === 1){
temp = temp + value
}
return temp
})
值得一提的是 ,但我这样写的时候:
let arr2 = arr1.reduce(function(temp, value){
if(value % 2 === 1){
temp = temp + value
return temp
}
})
得出的结果是 NaN,后来才想明白,如果只在符合条件的时候return temp,那么这个函数会在不符合条件的时候默认添加一个 return undefined,undefined 和 前面 temp里面的数字相加,就会得出NaN的结果