首页 > 其他分享 >数组的方法之遍历篇

数组的方法之遍历篇

时间:2023-03-10 11:02:29浏览次数:32  
标签:arr 遍历 let 数组 Array 方法 throw fn

forEach()

//Array.prototype.forEach()方法对每个元素执行一次提供的回调函数;

//第一个参数是我们提供的回调函数;

//第二个参数thisArg:回调函数中this指向,即如果我们想在回调函数中对非回调函数的作用域进行一些操作,那么就可以把操作的对象当成第二个参数传进去;

Array.prototype._forEach = function(fn,thisArg){

  if(typeof fn !== 'function') throw '参数必须为函数'

  if(!Array.isArray(this)) throw '只能对数组使用此方法'

  let arr = this

  for(let i = 0; i< arr.length; i++) {

    //就是在这里,使用call改变this指向,指向第二个参数;

    fn.call(thisArg, arr[i], i, arr)

  }

}

map()

//Array.prototype.map() 方法创建一个新数组,其结果是该数组中的每个元素调用一次提供的回调函数后的返回值。由此我们可以看出map()和forEach()最大的区别就是map()创建一个新数组,而forEach()是对原来数组的操作;

//两个参数和forEach()的参数一样;

Array.prototype._map = function(fn, thisArg) {

  if(typeof fn !== 'function') throw '参数必须为函数'

  if(!Array.isArray(this)) throw '只能对数组使用此方法'

  let arr = this

  //别忘了我们最终是要返回一个新的数组

  let newArr = []

  for(let i = 0; i < arr.length; i++) {

    //把每次调用回调函数fn的返回值push到新的数组

    newArr.push(fn.call(thisArg, arr[i], i, arr))

  }

  //最后返回这个新数组

  return newArr

}

filter()

//Array.prototype.filter()方法创建一个新数组,其包含通过给定函数测试的所有元素;注意调用这个方法会返回一个新数组,并且新数组中的元素是经过我们筛选的;

//两个参数和forEach()的参数一样;

Array.prototype._filter = function(fn, thisArg) {

  if(typeof fn !== 'function') throw '参数必须是回调函数'

  if(!Array.isArray(this)) throw '只能为数组使用此方法'

  let arr = this

  let newArr = []

  for(let i = 0; i< arr.length; i++) {

    if(fn.call(thisArg, arr[i], i, arr)){

      newArr.push(arr[i])

    }

  }

  return newArr

}

reduce()

//Array.prototype.reduce()方法对数组中的每一个元素执行一个我们提供的回调函数(reducer函数,升序执行),并将结果汇总为单个返回值;reduce()方法和上面三个都不同,它返回的不是数组而是单个返回值

//第一个参数是回调函数

//第二个参数是初始值,即累加的时候需要有一个起始值;

Array.prototype._reduce = function(fn, initialV) {

  if(typeof fn !== 'function') throw '参数必须是回调函数'

  if(!Array.isArray(this)) throw'只能为数组使用此方法'

  //给个空数组又不给初始值,那累加个什么。。。

  if(!this.length && ! initialV) throw '请传入初始值或非空对象使用此方法'

  let arr = this

  let result = initialV || arr[0]

  for(let i =0; i< arr.length; i++) {

    //如果提供了初始值,则累加的起始索引为0,否则就把第一个元素作为累加的基础,再从第二个元素开始加;即如果没提供初始值,我们就跳过本次循环继续下次循环;

    if(!initialV && i ===0) continue

    //通过递归的方式,把这次的累加的结果作为下次累加的基础

    result = fn( result, arr[i], i, this)

  }

  return result

}

标签:arr,遍历,let,数组,Array,方法,throw,fn
From: https://www.cnblogs.com/rain111/p/17202644.html

相关文章

  • 简单到复杂:C#拷贝文件的3种方法
        最近遇一个问题,一个程序调用另一个程序的文件,结果另一个程序的文件被占用,使用不了文件。这时候的解决方案就是把另一个程序的文件拷贝到当前程序就可以了。本文介......
  • python工具jupyternotebook页面打开空白问题解决方法
    jupyternotebook页面打开空白问题解决方法下载anaconda自带的jupyternotebook找到这个配置文件C:\Users\Administrator.jupyter\jupyter_notebook_config.py打开找......
  • python os模块使用(遍历指定目录)
    pythonos模块使用(文件遍历)需求如下遍历指定目录,完成以下操作1:判断该目录下所有的文件的名称及大小,文件大小以用户选择的方式显示(KB,MB,B)list_file()oslistdirfile......
  • 数组和哈希表的选择
    使用数组来做哈希的题目,是因为题目都限制了数值的大小。题目没有限制数值的大小,就无法使用数组来做哈希表了。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造......
  • C# HttpPost 【ContentType:multipart/form-data】表单提交 file 类型数据方法 2
    参考来源:https://blog.csdn.net/qq_39788123/article/details/128495546 try{Dictionary<string,string>headerDict=newDictiona......
  • Ubantu系统安装软件的方法
    方法一、直接在ubantu软件商店安装方法二、使用apt命令安装1.不止Ubantu,Dedbian系统的(Debain、Ubantu、Deepin、Raspbian等)都可以使用apt命令安装软件。2.Uba......
  • 关于JAVA泛型数组类型擦除引发的问题及解决方案
    先看如下一个DEMO示例代码:(其中doBatchGet被子类重写了1次)publicabstractclassBaseDemoService<T>{publicStringbatchGet(T...ints){Tone=ints[......
  • 【LeeCode】350. 两个数组的交集 II
    【题目描述】给你两个整数数组 ​​nums1​​ 和 ​​nums2​​ ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致......
  • 方法论系列:用四个金字塔来说明金字塔原理
    一、综述之前发表的一系列博客主要以技术原理及应用为主,很少发布“方法论”相关的内容;在日常工作中有一些好的方法论的加持,可以让工作内容更顺利的推进,达到事半功倍的效果......
  • 变量交换方法(使用按位异或操作符)
    按位异或操作符:^作用:一个整形在计算机中按二进制存储,按位异或即按二进制位将两个数对比,相同为0,相反为1;举例如下:1#include<stdio.h>23intmain()4{5......