es6新增处理数组的方法,map、forEach、filter、some、every、reduce等

map对数组遍历并返回新数组

使用方法

  1. const arr = [1,2,3];
  2. let resArrFor = arr.forEach(item=>{
  3. console.log(item*2)
  4. return item*2
  5. })
  6. console.log(resArrFor); // undefined

forEach对数组遍历,不返回值

使用方法

  1. let resArr = arr.map(item=>{
  2. console.log(item*2)
  3. return item*2
  4. })
  5. console.log(resArr); //[2,4,6]

注意事项:

forEach只会将异步代码执行,不会等待回调函数的结果,所以在内部使用await或promise无效。不会等待内部异步执行完成后才执行后续同步代码,要解决此问题,只能使用for替代。

  1. const list = [1,2,3,4,5]
  2. let run = (num)=>{
  3. return new Promise((resolve, reject)=>{
  4. setTimeout(()=>{
  5. resolve(num)
  6. },1000)
  7. })
  8. }
  9. let testForEach = ()=>{
  10. list.forEach(async l=>{
  11. const r = await run(l)
  12. console.log('forEach执行结果: ',r);
  13. })
  14. console.log('forEach外部log');
  15. }
  16. console.log('------------------------');
  17. let testFor = async()=>{
  18. for(let i=0;i<list.length;i++){
  19. const r = await run(list[i])
  20. console.log('for执行结果: '+r);
  21. }
  22. console.log('for外部log');
  23. }
  24. testForEach()
  25. testFor()

以上代码执行结果
forEach外部log
forEach执行结果: 1
forEach执行结果: 2
forEach执行结果: 3
forEach执行结果: 4
forEach执行结果: 5
————————————
for执行结果: 1
for执行结果: 2
for执行结果: 3
for执行结果: 4
for执行结果: 5
for外部log
forEach会先打印后边的log,然后同时打印出来1-5的执行结果。forEach在执行异步的时候类似并发执行。使用for执行会等待异步的结果。

filter的用法

使用filter对数组去重

  1. const array = [5,4,7,8,9,2,7,5];
  2. // 主要是,如果值存在,则索引值只会使用第一个的,后边的值会被过滤掉
  3. array.filter((item,idx,arr) => arr.indexOf(item) === idx);

reduce的使用

reduce可以处理数组的去重、扁平化、求和等,reduce(function(prev, now, index, arr){ }, value?)
参数(prev, now, index, arr),value为迭代开始的值

  • prev: 表示函数执行时的上一个元素,如果value不存在,第一次表示数组的第一个值,否则就是value的值
  • now:表示函数执行时的当前元素,如果value 不存在,第一次表示数组第二个值,否则是数组第一个值
  • index: 从0开始,索引值
  • arr:表示数组

    使用reduce求和

    1. let arr1 = [1,2,3,4,5,6,7,8,9]
    2. console.log("数组求和",arr1.reduce((prev, now)=>{
    3. return prev + now;
    4. }))

    使用reduce将数组扁平化

    1. let arr2 = [1,2,[3,"k",[8,"o"],["p"]],"p",[9,0]]
    2. let flatArray = (arr)=>{
    3. return arr.reduce((prev, now)=>{
    4. return prev.concat(Array.isArray(now) ? flatArray(now) : now)
    5. },[])
    6. }
    7. console.log("数组扁平化", flatArray(arr2))

    使用reduce求数组元素的个数

    1. let fruit = ["苹果","香蕉", "橘子", "香蕉", "西瓜", "樱桃", "苹果"]
    2. let fruitNum = fruit.reduce((prev, now)=>{
    3. if(now in prev){
    4. prev[now]++;
    5. }else{
    6. prev[now] =1;
    7. }
    8. return prev;
    9. },{})
    10. console.log("水果的个数", fruitNum)

    使用reduce将数组去重

    1. let arr3 = [1,2,3,1,2,3,2,4,5,6,6,1,2,7,8,9]
    2. console.log("去重后的数组",arr3.reduce((prev, now)=>{
    3. if(prev.includes(now)){
    4. return prev
    5. }else{
    6. return prev.concat(now)
    7. }
    8. },[]))