pop push shift unshift every some filter map forEach【数组API重构】

本文详细重构了JavaScript数组的pop, push, shift, unshift方法,并介绍了五个遍历函数如every, some, map, filter, forEach的实现。通过实例展示了如何在原数组上进行操作并理解函数式编程在数组操作中的应用。
摘要由CSDN通过智能技术生成

1.重构pop 数组api源码 ****
参数:无 返回值:删除的数组元素 是否修改原数组:修改

var arr=[1,2,3,4];
Array.prototype.myPop=function(){
	// 考虑数组为空
	if(this.length>0){
		let last=this[this.length-1];
		this.length--;
		return last
	}else{
		return undefined
	}
}
var res=arr.myPop();
console.log(res,arr);//4

2.重构push方法
参数:任何想要添加的数据类型 返回值:新数组的长度 修改原数组

var arr=[1,2,3,4];
Array.prototype.myPush=function(){
	console.log(arguments);
	for(let i=0;i<arguments.length;i++){
		this[this.length]=arguments[i]
	}
	return this.length
}
var res=arr.myPush('hello',12,5);
console.log(res,arr);

3.重构shift方法
参数:无 返回值:删除掉的数组元素 修改原数组

var arr=[1,2,3,4];
Array.prototype.myShift=function(){
	let first=this[0];
	for(let i=0;i<this.length;i++){
		this[i]=this[i+1]
	}
	this.length--
	return first;
}
var res=arr.myShift();
console.log(res,arr);

4.重构unshift方法
参数:任何想要添加的数组元素 返回值:新数组长度 修改原数组

var arr=[1,2,3,4];
Array.prototype.myUnshift=function(){
	// 计算新数组长度
	let sum=this.length+arguments.length
	for(let i=sum;i>0;i--){
		// 将原数组的元素向后移动auguments.length
		if(i>arguments.length){
			this[i-1]=this[i-1-arguments.length]
		}else{
			this[i-1]=arguments[i-1]
		}
	}
	return sum
}
var res=arr.myUnshift('hello',5);
console.log(res,arr);

五个迭代方法 遍历每一个数组元素
1.every
参数:函数(item,index,arr) 返回值:true或者false 不修改原数组

var arr=[1,2,3,4];
Array.prototype.myEvery=function(fun,obj){
	for(let i=0;i<this.length;i++){
		if(!(obj?fun.call(obj,this[i],i,this):fun(this[i],i,this))){
			return false
		}
	}
	return true
}
var res=arr.myEvery(function(item,index,arr){
	// every 只要有一个不满足条件 跳出循环 不再向下判断
	// console.log('1111');
	console.log(this);//this  -global
	// 只要写了第二个参数 this--->第二个参数
	return item>1
},'hello');
console.log(res,arr);

2…some
只要有一个满足条件 返回true 跳出循环

var arr=[1,2,3,4];
Array.prototype.mySome=function(fun,obj){
	for(let i=0;i<this.length;i++){
		// 只要有一个满足条件 返回true
		// call apply bind
		if(obj?fun.bind(obj,this[i],i,this)():fun(this[i],i,this)){
			return true
		}
	}
	return false
}
var res=arr.mySome(function(item,index,arr){
	console.log(this);
	return item>1
},{name:"zhangsan"});
console.log(res);

3…map 映射对每一个数组元素做操作
参数:函数(item,index,arr) 返回值:操作后的新数组

var arr=[1,2,3,4];
Array.prototype.myMap=function(fun,obj){
	let newArr=[];
	for(let i=0;i<this.length;i++){
		newArr.push(obj?fun.call(obj,this[i]):fun(this[i]))
	}
	return newArr
}
var res=arr.myMap(function(item,index,arr){
	console.log(this);
	return item+1
},{name:"zhangsan"});
console.log(res);

4.filter 过滤符合条件的数组元素组成新数组
返回值:新数组 参数:函数(item,index,arr),this指向变化

var arr=[1,2,3,4];
Array.prototype.myFilter=function(fun,obj){
	let newArr=[];
	for(let i=0;i<this.length;i++){
		if(obj?fun.call(obj,this[i]):fun(this[i])){
			newArr.push(this[i])
		}
	}
	return newArr;
}
var res=arr.myFilter(function(item,index,arr){
	console.log(this);
	return item>2
},{name:"zhangsan"});
console.log(res,arr);

5.forEach 遍历数组

var arr=[1,2,3,4];
Array.prototype.myForEach=function(fun,obj){
	for(let i=0;i<this.length;i++){
		obj?fun.call(obj,this[i]):fun(this[i])
	}
}
var res=arr.myForEach(function(item,index,arr){
	console.log(this);
	console.log(item);
},{name:"zhangsan"});
console.log(res);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值