目录
一、栈与队列方法
1.重构pop方法
pop() 方法用于删除数组的最后一个元素并返回删除的元素。
参数:无 返回值:删除掉的数组元素 修改原数组
Array.prototype.myPop=function(){
if(this.length>0){
// 返回值 返回删除的数组最后一项
var last = this[this.length-1];
// 数组长度减1
this.length--;
return last;
}else{
// 数组为空
return undefined
}
}
var arr = [1,2,3,4,5];
var res = arr.myPop();
console.log(res,arr);
2.重构push方法
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
参数:添加数组元素 返回值:返回新数组的长度 修改原数组
Array.prototype.myPush = function(){
// [1 2 3,] this[this.length]
// 遍历调用myPush实际参数 把实际参数放在数组的末尾下一项
/**arguments类数组
按索引从小到大循环数组
arguments,是调用函数时,传入的参数数组
console.log(arguments);*/
for(i=0;i<arguments.length;i++){
this[this.length]=arguments[i]//给当前数组的最末端,加入一个新的元素
}
return this.length
}
var arr = ['hello','10',25];
var res = arr.myPush('tom','terry');
console.log(res,arr);
function fc(a,b){
// console.log(a,b)
// 函数内部属性 arguments 专门保存实际参数的类数组对象 下角标 索引
console.log(arguments[3])//0123,索引为4
}
fc(1,2,3,4,5)
3.重构shift方法
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
参数:无 返回值:返回删除的第一项数组元素 修改原数组
Array.prototype.myShift = function(){
// 先获取第一项数组元素
var first = this[0];
for(var i=0;i<this.length;i++){
// 将后面得所有数组元素往前移动一位
this[i] = this[i+1];
}
// 数组长度减1
this.length--;
// 返回第一项
return first
}
var arr = [1,2,3,4,5];
var res = arr.myShift();
console.log(res,arr);
4.重构unshift方法
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
参数:增加的数组元素 返回值:新数组的长度 修改原数组
Array.prototype.myUnshift=function(){
// console.log(arguments.length);
// 新数组长度 sum = 原数组长度 + 实参得个数(arguments得长度auguments.length)
var sum = this.length + arguments.length;
for(i=sum;i>0;i--){
// 将原数组得中数组元素向后移动argument.length位
if(i>arguments.length){
// 1 2 3 4 5 [4]
// xxx xxx 1 2 3 4 5 [6]
// this[6] = this[4]
this[i - 1] = this[i - 1 - arguments.length]
}else{
this[i - 1] = arguments[i-1]
}
}
// 返回新数组得长度
return sum
}
var arr = [1,2,3,4,5];
var res = arr.myUnshift('tom','larry');
console.log(res,arr);//['tom','larry','terry',1,2,3,4,5]
二、迭代方法
1.重构forEach
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。 forEach() 对于空数组是不会执行回调函数的。
Array.prototype.myForEach = function(callback){
// callback ---> function(item,index,arr){console.log(item,index,arr)}
for(var i=0;i<this.length;i++){
callback(this[i],i,this)
}
}
var arr = [1,2,3,4,5];
arr.myForEach(function(item,index,arr){
console.log(item,index,arr)
});
2.重构every
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
-
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
-
如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。
注意: every() 不会改变原始数组。
Array.prototype.myEvery = function(callback){
for(var i=0;i<this.length;i++){
// 找不符合条件表达的数组元素直接返回false 其他返回true
if(!callback(this[i])){
return false
}
}
return true
}
var arr = [1,2,3,4,5];
var res = arr.myEvery(function(item){
console.log('every');
return item>0
});
console.log(res);
3.重构some
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
-
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
-
如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。
注意: some() 不会改变原始数组。
Array.prototype.mySome = function(callback){
for(var i=0;i<this.length;i++){
// 只要有一个数组元素符合条件表达式 直接返回true
if(callback(this[i],i,this)){
return true
}
}
return false
}
var arr = [1,2,3,4,5];
var res = arr.mySome(function(item,index,arr){
console.log('some')
return item>5
});
console.log(res);
4.重构map
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
Array.prototype.myMap = function(callback){
var newArr = [];
for(var i=0;i<this.length;i++){
newArr.push(str?callback.bind(str,this[i])(i,this):callback(this[i]))
}
return newArr
}
var arr = [1,2,3,4,5];
var res = arr.myMap(function(item,index,arr){
return item+5
}'hello');
console.log(res);
5.重构filter
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
Array.prototype.myFilter = function(callback){
var newArr = [];
for(var i=0;i<this.length;i++){
if(callback(this[i])){
newArr.push(this[i])
}
}
return newArr;
}
var arr = [1,2,3,4,5];
var res = arr.myFilter(function(item){
return item > 3
});
console.log(res);