美文网首页
记录数组的一些高阶方法

记录数组的一些高阶方法

作者: 没头脑很不高兴 | 来源:发表于2017-12-05 23:16 被阅读0次

分成以下两类:会改变原数组的和不会改变原数组的

一、会改变原数组的

1 .sort()
之前写过一篇 点击这里查看

二、不会改变原数组的

  1. 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),和写一个数组进去是一样的效果,估计是浏览器自动纠错的功能
这个不算高阶。。。

  1. 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]
  1. 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本身有过滤的意思,它只会返回符合条件的结果,并且把这个结果扔进一个数组

  1. 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的结果

相关文章

网友评论

      本文标题:记录数组的一些高阶方法

      本文链接:https://www.haomeiwen.com/subject/xbvhixtx.html