乐趣区

ES5-数组-api-使用与实现

forEach

用来循环一个数组, 不会直接改变原数组。循环过程不能跳出。没有返回值。
forEach() 遍历的范围在第一次调用 callback 前就会确定。调用 forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach() 遍历到他们那一刻的值。已删除的项不会被遍历到。如果已访问的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过
MDN.js.array.froEach

  • 用法:

      [1,2,3].forEach((item,index,arr)=>{},{a:1})
  • 参数:

    • 参数一是一个函数,参数如下:

      • item: 数组的每一项
      • index: 每一项所对应的的索引
      • arr: 数组本身
    • 参数二是一个对象

      • 没传的话,参数一内的 this 指向 windows
      • 否则指向参数二本身
  • 实现:

      Array.prototype.myForEach=function (fn,obj) {for(var i=0;i<this.length;i++){if(typeof obj=="undefined"){
                  //obj 没有传
                  fn(this[i],i,this);
              }else {fn.call(obj,this[i],i,this);
              }
          }
      };

map

映射,由一个数组映射为一个新的数组. 不改变原数组
MDN.js.array.map

  • 用法:

      const newArr = [1,2,3].map((item,index,arr)=>{return item * item},{a:1})
      console.log(newArr) // [1,4,9]
  • 参数:

    • 参数一是一个函数,参数如下:

      • item: 数组的每一项
      • index: 每一项所对应的的索引
      • arr: 数组本身
    • 参数二是一个对象

      • 没传的话,参数一内的 this 指向 windows
      • 否则指向参数二本身
  • 实现

      Array.prototype.myMap=function (fn,obj) {var arr=[];
          for(var i=0;i<this.length;i++){if(typeof obj=="undefined"){arr.push(fn(this[i],i,this));
              }else {arr.push(fn.call(obj,this[i],i,this));
              }
          }
          return arr;
      };

filter

用来过滤数组
filter 不会改变原数组,它返回过滤后的新数组。
MDN.js.array.filter

  • 用法:

      const newArr = [1,2,3].filter((item,index,arr)=>{return item>=2},{a:1})
      console.log(newArr) // => [2,3]
  • 参数:

    • 参数一是一个函数,参数如下:

      • item: 数组的每一项
      • index: 每一项所对应的的索引
      • arr: 数组本身
    • 参数二是一个对象

      • 没传的话,参数一内的 this 指向 windows
      • 否则指向参数二本身
  • 实现
    Array.prototype.myFilter=function (fn,obj) {var arr=[];
        for(var i=0;i<this.length;i++){if(typeof obj=="undefined"){if(fn(this[i],i,this)){arr.push(this[i]);
                }
            }else {if(fn.call(obj,this[i],i,this)){arr.push(this[i]);
                };
            }
        }
        return arr;
    };

reduce

对数组中的每个元素执行一个由您提供的 reducer 函数 (升序执行),将其结果汇总为单个返回值。
MDN.js.array.indexOf

  • 用法:

      const result = [1,2,3].reduce((acc,item,index,arr)=>{return acc + item;},0)
      console.log(result) //6
  • 参数:

    • 参数一是一个函数,参数如下:

      • acc: 累加器
      • item: 数组的每一项
      • index: 每一项所对应的的索引
      • arr: 数组本身
    • 参数二: 初始值
  • 实现

      Array.prototype.myReduce = function(fn, value = 0) {for (let i = 0; i < this.length; i++) {value = fn(value, this[i], i, this);
          }
          return value;
      };

indexOf

返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回 -1
MDN.js.array.indexOf

  • 用法:

      const index = [1,2,3].indexOf(2) //1
      const index = [1,2,3,2].indexOf(2,2) //3
  • 参数:

    • 参数一: 需要查找的元素
    • 参数二:可选,开始查找的下标。
      如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回 -1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即 - 1 表示从最后一个元素开始查找,- 2 表示从倒数第二个元素开始查找,以此类推。注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于 0,则整个数组都将会被查询。其默认值为 0.
  • 实现:

      Array.prototype.myIndexOf = function(target,start = 0){
          let startInner = start;
          const len = this.length;
          if(start<0){startInner =  start + len}
          if(start>len){return -1}
          for (let i = startInner; i < len; i++) {if(this[i]===target) return i // === 判断
          }
          return -1
      }

every,some

every 数组每一项都满足条件才会返回 true
some 数组只要有满足条件的就会返回 true
MDN.js.array.every
MDN.js.array.some

  • 用法

      const flag = [1,2,3].every((item,index,arr)=>item>2) //false
      const flag = [1,2,3].some((item,index,arr)=>item>2) //true
  • 参数:

    • 参数一是一个函数,参数如下:

      • item: 数组的每一项
      • index: 每一项所对应的的索引
      • arr: 数组本身
    • 参数二是一个对象

      • 没传的话,参数一内的 this 指向 windows
      • 否则指向参数二本身
  • 实现

      Array.prototype.myEvery = function (fn,obj){
          const len = this.length;
          if(len===0){return true;}
          let accLen = 0;
          for(let i=0; i<len; i++){if(typeof obj=="undefined"){if(fn(this[i],i,this)){accLen+=1}
            }else{if(fn.call(obj,this[i],i,this)){accLen+=1}
            }
          }
          if(accLen === len) return true;
          return false
      }
    
      Array.prototype.mySome = function (fn,obj){
          const len = this.length;
          if(len===0){return true;}
          let accLen = 0;
          for(let i=0; i<len; i++){if(typeof obj=="undefined"){if(fn(this[i],i,this)){accLen+=1}
            }else{if(fn.call(obj,this[i],i,this)){accLen+=1}
            }
          }
          if(accLen>0) return true;
          return false
      }
    • 原文地址 ES5 数组 api 使用与实现
    • 另外我的博客地址 blog 会经常分享 最近的学习内容,项目中遇到的问题及解决方案
退出移动版