手写实现数组的方法

手写实现数组的方法


some

 该方法用于检测数组中的元素是否满足指定条件 ,只要有一个满足就返回true,否则false.不会改变原数组。
let data=[1,2,3];
Array.prototype.mySome=function(fn){  // fn=item => {return item > 2}
    if(typeof fn!='function'){
      throw new TypeError('这不是一个函数')
    }
    for(let i=0;i<this.length;i++){
      if(fn(this[i])){ //返回的值
        return true
      }
    }
    return false
  }
  let some = data.mySome(item => {
    return item > 2
  })

every

是对数组中每一项运行给定函数,如果该函数所有一项返回true,则返回true。一旦有一项不满足则返回flase,不会改变原数组。
let data=[1,2,3,4];
Array.prototype.myEvery = function(fn) { //必须使用function不能使用箭头函数,this指向调用的数组
    if(typeof fn != 'function'){
      throw new TypeError(`error ${fn} no a function `)
    }
    for (let i = 0; i < this.length; i++) {
      if(!fn(this[i])){
        return false
      }
    }
    return true
  }

  let every = data.myEvery(item => {
    return item > 2
  })

filter

 使用指定的函数测试所有元素,并创建一个包含所有通过测试的元素的新数组。返回新数组。不会改变原数组
Array.prototype.myFilter=function(fn){
  if(typeof fn!='function'){
    throw new TypeError(`this is ${fn} is not function`)
  }
  let newFilterData=[];
  for(let i=0;i<this.length;i++){
    if(fn(this[i])){
      newFilterData.push(this[i])  //push的是每一项不是返回的结果
    }
  }
  return newFilterData;  //返回新数组
}
let filter=data.myFilter(item=>{
  return item>1
})

map

map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。返回新数组,    不会改变原数组
	Array.prototype.myMap=function(fn){
	  if(typeof fn!='function'){
	    throw new TypeError(`this is ${fn} is not function`)
	  }
	  let newArray=[];
	  for(let i=0;i<this.length;i++){
	    if(fn(this[i])){
	      newArray.push(fn(this[i]))  //push的结果
	    }
	  }
	  return newArray;
	}
	
	let map=data.myMap(item=>{
	  return item+'map'
	})

reduce

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。不会改变原数组
	Array.prototype.myReduce=function(fn,obj){
	  if(typeof fn!='function'){
	    throw new TypeError(`this is ${fn} is not function`)
	  }
	 
	  for(let i=0;i<this.length;i++){
	    obj=fn(obj,this[i])
	  }
	  return obj
	}
	// fn=(pre,item)=>{pre= pre+item return pre}
	let reduce=data.myReduce((pre,item)=>{
	  pre= pre+item
	  return pre
	},0)
	//求元素中出现的次数(面试题)
	let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
	let count=names.myReduce((pre,cur)=>{
	  if(cur in pre){
	    pre[cur]++
	  }else{
	    pre[cur]=1
	  }
	  return pre;
	},{})

总结


  1. 相同点:都不会改变原数组

  2. 不同点:

    map():有返回值,可以return出来

    forEach():没有返回值

    filter():返回一个符合func条件的元素数组(并没有改变原数组)

    some():返回一个boolean,判断是否有元素是否符合func条件(有一个就行)

    every():返回一个boolean,判断每个元素是否符合func条件(所有都判断)
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值