我之前李姐的方法重构会认为:(这是一个很复杂的代码复盘)但这次暂时不是滴;

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_前端

浅谈数组方法重构再封装

这次李姐的数组方法重构:
针对这个原有的数组方法进行重新构造,并且完成封装成(放在函数里)(那此时此刻就感觉谁发明的这些词,给我整yue了,太唬人了属于是)

再此过程中理解数组方法的存储地址,理解回调函数的使用方法,和场景;加深自己对封装,回调的理解和应用。

什么是callback回调:

私人解释:
callback:封装异步代码,封装类似循环过程
函数当做实际参数,a是b的回调函数

function a(res){
console.log('aa');
console.log('res:',res);
}
function b(callback){
console.log('bb');
callback(100)

}
b(a)

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_前端_02

重构push()方法

Array.prototype.myPush = function(){
console.log(this);
console.log('我是 mypush函数');
for(var i=0;i<arguments.length;i++){
this[this.length] = arguments[i]
}
return this.length;
}
var arr = [1,2,3]
var len = arr.myPush(4,5,6)
console.log('arr:',arr);
console.log("新的arr的长度是",len);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_重构_03

重构unshift()方法

Array.prototype.myUnshit = function(){
var len = this.length;
var inLen = arguments.length;


for(var i=len-1;i>=0;i--){
// this[0] = arguments[i]
this[i+inLen] = this[i]
}
for(var i=0;i<inLen;i++){
this[i] = arguments[i]
}
return this.length;
}
var arr = [1,2,3]
console.log("原来arr:",arr);
console.log("原来arr的长度是",arr.length);

var len = arr.myUnshit(4,5,6)
console.log('新的arr:',arr);
console.log("新的arr的长度是",len);

重构shift()方法

Array.prototype.myShit = function(){
if (this.length <=0) return ''
var data = this[0];
for(var i=1;i<this.length;i++){
this[i-1] = this[i]
}
this.length--
return data;
}
var arr = [1,2,3]
console.log("原来arr:",arr);
console.log("原来arr的长度是",arr.length);

var len = arr.myShit()
console.log('新的arr:',arr);
console.log("删除的数据是",len);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_javascript_04

原forEach()方法的使用

数组常用方法 forEach
语法: 数组.forEach(function (item, index, origin) {})
item 就是数组内的每一项
index 就是数组内每一项的索引
origin 就是原始数组
返回值: undefined

var arr = [10,20,30]
arr.forEach(function(item,index,origin){
console.log(item);
console.log('index:',index);
console.log('origin:',origin);
})

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_i++_05

重构封装forEach()

Array.prototype.myForEach = function(callback){
for(var i = 0;i<this.length;i++){
console.log(this[i]);
callback(this[i],i,this)
}
}
var arr = [1,2,3,4]
var sum = 0
arr.myForEach(function(data,i,arr){
sum += data ;
// console.log("做事");
// console.log("数组的每一项",data);
// console.log("sum:",sum);
})
console.log(sum);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_前端_06

重构封装Map()方法

myMap 方法
根据原始数组 和 我给出的条件, 把 原始数组内的内容 全部修改, 放在一个新数组内返回

Array.prototype.myMap = function(callback){
var res = [];

for(var i=0;i<this.length;i++){
res.push(callback(this[i],i,this));
}

return res;
}

var arr = [10,20,30]
var res =arr.myMap(function(item,index,origin){
return item*10
})
console.log(res);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_重构_07

重构filter()过滤方法

语法: 数组.filter(function (item, index, origin) {})
作用: 从原始数组中过滤出满足要求的项,放在新数组内
返回值: 一个新数组, 存储的是原始数组中满足要求的数据
注意: 以 return 的形式书写 过滤条件

var arr = [1,2,3,4,5,5,1,2,3,8,6,7]
console.log(arr);
Array.prototype.myFultre = function(callback){
var res = []
for(var i=0;i<this.length;i++){
callback(this[i]) && res.push(this[i])
}
return res;
}
arr = arr.myFultre(function(item,index,origin){
// 过滤掉元素值大于3的元素
return item >3
// 过滤掉元素值是3的元素
return item !== 3
})
console.log(arr);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_javascript_08

重构find()方法

方法: find()
语法: 数组.find(function (item, index, origin) {})
返回值: 原始数组内满足条件的第一项
注意: 以 return 的形式书写查找条件

var arr = [
{ id: 1, name: 'Jack' },
{ id: 2, name: 'Rose' },
{ id: 3, name: 'Tom' },
{ id: 2, name: 'Jerry'}
]

Array.prototype.myFind = function(callback){
var res = undefined
for(var i=0;i<this.length;i++){
var flag = callback(this[i]) && (res = this[i])
if(flag){
break;
}
// if(callback(this[i])){
// res = this[i]
// break
// }
}
return res;
}

var res = arr.myFind(function(item,index,origin){
return item.id == 2?true:false
})
console.log(res);
res.name = 'timi';

console.log(res);
console.log(arr);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_前端_09

+ find 多用于查找 [] 内存储的是复杂数据类型
+ 作用: 根据一个条件找到一条数据
+ 问题: 你为什么要找他 ?
=> 找到这条信息进行 增删改查
+ 如果 find 方法实现的是 深拷贝
=> 你的返回值和数组内的内容是两个 数据结构
=> 当你使用 返回值修改的时候, 数组内的数据不变
+ 最好的方案, 把数组中某一条数据的 地址 拿出来(即浅拷贝)
=> 利用返回值修改的时候,

重构every()方法

方法: every()
语法: 数组.every(function (item, index, origin) {})
返回值: 必然是一个 布尔值
如果原始数组中每一个数据都满足条件, 返回的是 true
只要有任何一个不满足条件, 返回值就是 false

var arr = [1,2,3,4,5,5,1,2,3,8,6,7]
console.log(arr);

Array.prototype.myEvery = function(callback){
var flag = true;
for(var i=0;i<this.length;i++){
if(!callback(this[i])){
flag = false;
break
}
}
return flag;
}


var res = arr.myEvery(function(item,index,origin){
return item < 110

})
console.log(res);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_前端_10

重构some()方法

方法: some()
语法: 数组.some(function (item, index, origin) {})
返回值:必然是一个布尔值
如果数组中有任意一个满足条件, 最终返回 true
只有数组中所有数据都不满足条件, 最终返回 false

var arr = [1,2,3,4,5,5,1,2,3,8,6,7]
console.log(arr);


Array.prototype.mySome = function(callback){
// 1. 假设都不满足条件
var flag = false;
for(var i=0;i<this.length;i++){
if(callback(this[i])){
flag = true
break;
}
}
return flag;

}

var res = arr.mySome(function(item,index,origin){
return item > 6
})

console.log(res);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_数组_11

重构reduce()方法

+ 语法: 数组.reduce(function (prev, item, index,) {}, init)
=> prev:
-> 循环的第一次表示的是 init 初始值
-> 循环的第二次开始表示的是 上一次的 结果
=> init: 表示叠加的初始值, 选填
-> 如果你填写了 init, 方法内数组遍历的时候, [0] 开始
-> 如果你没有填写 init, 默认使用数组 [0] 数据来充当 init, 方法内遍历的时候从 [1]
var arr = [ 10, 20, 30, 40, 50 ]
console.log('原始数组 : ', arr)

Array.prototype.myReduce = function(callback,init){
// 1. 决定一个遍历的开始位置
var start = init !== undefined ? init : 1
// 2. 判断 init 是否传递了, 来决定使用哪一个当做初始值
init = init ?? this[0]
for(var i = start;i<this.length;i++){
var init = callback(init,this[i])
// console.log(init);
}

return init
}

var res = arr.myReduce(function(prev,item){
return prev+item
},0)

console.log(res);

浅谈数组方法重构再封装-forEach-Map——push(),unshift(),shift(),Map(),filter(),every(),some(), reduce()_javascript_12