ES5新增数组方法的实现

1. forEach:

<!DOCTYPE html>
 <html>
 <head>
 	<meta charset="utf-8">
 	<meta http-equiv="X-UA-Compatible" content="IE=edge">
 	<title></title>
 	<link rel="stylesheet" href="">
 </head>
 <body>
 	<!-- //数组扩展
	//1.forEach  2.Filter  3.Map  4.Every  5.Some  6.Reduce  7.ReduceRight -->
 	<script>

 		var arr=
 		[ {name:"ww",age:12},
 		  {name:"qq",age:13},
 		  {name:"yy",age:14},
 		  {name:"kk",age:15}
 		]
        var obj={name:"www"}
        var obj={name:"www"}

 	
//原型链上写自己的myForEach方法
 		Array.prototype.myForEach=function(func){
 			var _self=this;

 			for(var i=0;i<_self.length;i++){
 				 
 				func.apply(arguments[1]||window,[_self[i],i,_self])
 			}


 		}
 		arr.myForEach(function(ele,index,self){
 			console.log(ele,this);
 		},obj)
//可传两个参数,第二个为第一个参数里的this指向
  

2.filter

Array.prototype.myFilter=function(func){
			var _self=this;
 			var len=_self.length;
 			var newArr=[];		
 			for(var i=0;i<len;i++){
				if(func.apply(arguments[1]||window,[_self[i],i,_self])){
					newArr.push(_self[i]);
				}
				
			}
			return newArr;
		}

		// var newArr=arr.myFilter(function(ele,index,self){
		// 	return ele.age>14;
		// },obj)
		// console.log(newArr)

3.map

	Array.prototype.myMap=function(func){
			var _self=this;
 			var len=_self.length;
 			var newArr=[];	
 			for(var i=0;i<len;i++){
 				newArr.push(clone(func.apply(arguments[1]||window,[_self[i],i,_self])));//优化--clone深度克隆(原方法没有)
 			}
 			return newArr;
		}




		// var newArr=arr.myMap(function(ele,index,self){
		// 	ele.age+=ele.age;//如果ele是引用值修改会影响原数组

		// 	return ele;
		// },obj)

		// console.log(newArr,arr);
		//  newArr[0].name="wgfbqkgw";//修改会影响原数组
		// console.log(newArr,arr);



 function clone(Origin,Target){

		 	
		 	if(Object.prototype.toString.call(Origin)=="[object Object]")
		 	{
		 		var Target=Target||{};
		 	}else if(Object.prototype.toString.call(Origin)=="[object Array]"){
		 		var Target=Target||[];
		 	}


		    for(var prop in Origin){
		 		if(Origin.hasOwnProperty(prop)){
				 		var a=Object.prototype.toString.call(Origin[prop]);

				 		if(a=="[object Array]" ){
				 			Target[prop]=[];
				 			clone(Origin[prop],Target[prop]);

				 		}else if(a=="[object Object]"){
				 			Target[prop]={};
				 			clone(Origin[prop],Target[prop]);


				 		}else{
				 			Target[prop]=Origin[prop];
				 		}
				 		


				}

				 		
			}
			return Target;
		 		
	}

4.every

Array.prototype.myEvery=function(func){
			var _self=this;
 			var len=_self.length;
 			var flag=true;
 			for(var i=0;i<len;i++){
				if(!func.apply(arguments[1]||window,[_self[i],i,_self])){
					flag=false;
					break;
				} 
 				 
 			}
 			return flag;
		}



		// var flag=arr.myEvery(function(ele,index,self){
		// 	return ele.age>=12;
		// },obj)
		// console.log(flag)

5.some

Array.prototype.mySome=function(func){
			var _self=this;
 			var len=_self.length;
 			var flag=false;
 			for(var i=0;i<len;i++){
				if(func.apply(arguments[1]||window,[_self[i],i,_self])){
					flag=true;
					break;
				} 
 				 
 			}
 			return flag;
		}

		// var flag=arr.mySome(function(ele,index,self){
		// 	return ele.age>=15;
		// },obj)
		// console.log(flag);

6.reduce


	Array.prototype.myReduce=function(func,initialValue){
		var _arr=this,len=this.length;
		for(var i=0;i<len;i++){
			initialValue=func.apply(arguments[1]||window,[initialValue,_arr[i],i,_arr])
		}
		return initialValue;
	}	

	var lastValue=arr.myReduce(function(preValue,curValue,index,self){
		console.log(preValue,curValue,index,self);
		 preValue.name=preValue.name+"e";
		return preValue
	},{name:'e'},obj)


在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值