js数组的深度扩展

js 数组的深度扩展

foreach 方法 (遍历)

 

arr.foreach( function(ele, index, self){} )

1 arr.foreach(function(ele, index, self){
2     console.log(ele, index, self, this) //  数组元素  索引  数组整体  this指向
3     console.log(this[index]) //  提取类数组中当前索引的 li 标签
4 }, document.getElementsByTagName( 'li' ));

 在原型链上模拟

 1 Array.prototype.myForEach = function(fun){
 2     // personArray == this
 3     var arr = this,
 4         len = arr.length,
 5         _this = arguments[1] || window;
 6     for(var i = 0; i < len; i++){
 7         // ele 当前元素 index 索引 self 数组
 8         fun.apply(_this, [arr[i], i, arr]);
 9     }
10 }
11 personArray.myForEach(function(ele, index, self){
12     this[index].innerText = ele.name;
13 }, document.getElementsByTagName('li'));

filter 方法 (过滤)

arr.filter( function (ele, index, self) )

由于形式相同这里只在原型链上模拟

 

 1 Array.prototype.myFilter = function(fun){
 2     var arr = this,
 3         len = arr.length,
 4         _this = arguments[1] || window,
 5         newArray = [];
 6     for(var i = 0; i < len; i++){
 7         fun.apply(_this,[arr[i], i, arr]) ? newArray.push(arr[i]) : '';
 8     }
 9 
10     return newArray;
11 }
12 var arr = personArray.myFilter(function(ele, index, self){
13     return true; // 未加判断全部保留
14 })
15 console.log(arr); // 和 personArray 数组完全一样

 

map 方法 (映射)

arr.map( function (ele, index, self) )

 1 Array.prototype.myMap = function(fun){
 2     var arr = this,
 3         len = arr.length,
 4         _this = arguments[1] || window,
 5         newArray = [];
 6     for(var i = 0; i < len; i++){
 7         newArray.push(fun.apply(_this, arr[i], i, arr));
 8     }
 9 
10     return newArray;
11 }
12 var arr = personArray.myMap(function(ele, index, self){
13     return ele.name + '!!!'; // 实现元素 name 属性的拼串
14 })
15 console.log(arr); // 所有元素的 name 属性发生改变

every 和 some 方法

every 方法: 如果每一项都符合要求就返回 true

some 方法: 如果有一项符合要求就返回 true

 

reduce 方法 ()

arr.reduce( function(prve, cur, index, self), init )

prve 指的是上一次的值,如果没有就用 init 代替

 1 Array.prototype.myReduce = function(fun, init){
 2     var arr = this,
 3         len = arr.length,
 4         _this = arguments[2] || window; // 已有两个固定参数
 5     for(var i = 0; i < len; i++){
 6         init = fun.apply(_this, [init, arr[i], i, arr]);
 7     }
 8     return init;
 9 }
10 var arr = personArray.myReduce(function(prve, cur, index, self){
11     console.log(prve, cur, index, self); // 上次的值 当前值 索引 数组
12     return prev;
13 }, init);
14 // 举个小例子
15 var arr = [1, 2, 3, 4];
16 var result = arr.reduce(function(a, b){
17     console.log(a); // 0  1  3  6      prve 起始为 0 每次运算 a + b 保留结果 
18     console.log(b); // 1  2  3  4      cur   数组当前的值
19     return a + b;
20 }, 0);
21 console.log(result); // 10

在小例子中可以看出,最后 result 的结果为 10,a 即 prve 在开始时为 init 等于 0,b 即 cur 为 arr [0] 等于 1,所以第一次运行结果为 0 + 1,然后将结果返回给 a,以便下一次运算。在第二次运算中,a 为第一次的结果 1,b 为 arr [1] 等于 2,结果返回 1 + 2,第三次运算时 a 为 3 后面依照此规则知道将整个数组完全遍历,最终返回结果给 result。 

posted @ 2019-03-18 17:40  最後まで笑う  阅读(527)  评论(0)    收藏  举报