栈与队列方法重构
1.重构pop方法 删除数组的最后一个元素并返回删除的元素。
Array.prototype.myPop = function () {
if (this.length > 0) {
var last = this[this.length - 1];
this.length--;
return last;
} else {
return undefined
}
};
var arr = [1, 2, 3, 4];
var res = arr.myPop();//myPop方法被arr调用 方法内部this指向arr
console.log(res);
运行结果
2.重构push方法 在末尾添加元素,并返回添加后的长度
Array.prototype.myPush = function () {
// arr[arr.length] 将新增数组元素添加给原数组元素最后一项下一项
// 循环遍历实际参数 'tom' 'jack' 'zack'
for (var i = 0; i < arguments.length; i++) {
// 将每一个实际参数依次从末尾添加给原数组
this[this.length] = arguments[i]
}
return this.length
}
var arr = [1, 2, 3, 4];
var res = arr.myPush('tom', 'jack', 'zack', 'world');
console.log(res)
运行结果
3.重构shift方法 删除第一个元素,并返回第一个元素的值
Array.prototype.myShift = function () {
// 返回第一项
var first = this[0];
for (var i = 0; i < this.length; i++) {
// 将后面的数组元素往前移动一项
this[i] = this[i + 1]
}
this.length--;
return first
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myShift();
console.log(res);
运行结果
4.重构unshift 在第一个元素前添加元素,并返回新的长度
Array.prototype.myUnshift = function () {
// 获取新数组长度
var length = this.length + arguments.length;
// [1,2,3,4,5]//4 i=4
// [,,,1,2,3,4,5]//7 i=4+arguments.length i 7 i = i-arguments.length
// ['tom','larry','hello',1,2,3,4,5]
// 将原数组元素向后移动arguments.length位
for (var i = length - 1; i >= 0; i--) {
// 当i等于arguments.length-1 原数组元素移动完成
if (i > arguments.length - 1) {
this[i] = this[i - arguments.length]
} else {
this[i] = arguments[i]
}
}
// 新数组下标i为auguments.length-1
// 返回新数组长度
return length
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myUnshift('tom', 'larry', 'hello');
console.log(res);
运行结果
迭代方法重构
1.forEach 调用数组的每个元素,并将元素传递给回调函数。
var arr = [1, 2, 3, 4, 5];
Array.prototype.myForEach = function (callback) {
// callback--->function(){}
for (var i = 0; i < arr.length; i++) {
callback(arr[i], i, arr)
}
};
arr.myForEach(function (item, index, arr) {
console.log(item, index)
});
运行结果
2.every 判断数组元素是否符合表达式 只要有一项不符合直接返回false 跳出循环
Array.prototype.myEvery = function (callback) {
for (var i = 0; i < arr.length; i++) {
// 把函数调用当作条件的判断
if (!callback(arr[i], i, arr)) {
return false
}
}
return true
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myEvery(function (item, index, arr) {
return item > 1
});
console.log(res);
3.some 判断数组元素是否符合表达式 只要有一个符合就返回true 跳出循环
Array.prototype.mySome = function (callback) {
for (var i = 0; i < arr.length; i++) {
// 只要有一个满足条件 直接返回true
if (callback(arr[i], i, arr)) {
return true
}
}
return false
}
var arr = [1, 2, 3, 4, 5];
var res = arr.mySome(function (item, index, arr) {
return item > 5
});
console.log(arr, res);
运行结果
4.filter 过滤符合条件数组元素组成新数组
Array.prototype.myFilter = function (callback) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (callback(arr[i], i, arr)) {
// newArr.push(arr[i])
newArr[newArr.length] = arr[i]
}
}
return newArr
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myFilter(function (item, index, arr) {
return item > 4
});
console.log(res);
运行结果
5.map 映射 对每一个数组元素进行操作
Array.prototype.myMap = function (callback) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
newArr[newArr.length] = callback(arr[i], i, arr)
}
return newArr
};
var arr = [1, 2, 3, 4, 5];
var res = arr.myMap(function (item, index, arr) {
return item + 5
});
console.log(res)
运行结果