实现map:
<script> /* 实现map()迭代方法 思路: 对于每一项执行的函数 接收3个参数 : 数组项的值, 数组项的下标, 数组对象本身 指定this的作用域 返回每次函数调用结果组成的数组. arr.map(function(item,index,arr) {}, obj) 第二个参数obj 可选; */ Array.prototype.myMap = function(fn, obj) { if(typeof fn !== 'function') { throw new TypeError(`${fn} is not a function`) } // 原数组 const array = this; obj = Object(obj) || global;//严格模式下 // 返回结果数组 const resultArr = []; var result; // 迭代执行 for(let i = 0; i < array.length; i++) { let item = array[i]; result = fn.call(obj, item, i, array) resultArr.push(result); } return resultArr; } var arr = [1, 2,3 ,11, 33]; var resultArr = arr.myMap(function(item,index, arr) { return item + 10; }) console.log(resultArr);//[11, 12, 13, 21, 43] </script>
实现filter方法
/* 实现filter() 方法 对于每一项执行的函数 接收3个参数: 该数组项的值, 该数组项的下标, 该数组本身对象 指定this的作用域对象 filter() 方法返回执行结果为true的项组成的数组 arr.filter(function(item,index, arr){}, obj) 第二个参数obj 可选; */ Array.prototype.myFilter = function(fn, obj) { if(typeof fn !== 'function') { throw new TypeError(`${fn} is not a function`) } obj = Object(obj) || window; // 原数组 let arr = this; // 返回结果数组 let resultArr = []; let result = false; // 迭代返回值为true的项的组合 for(let i = 0; i < arr.length; i++) { result = fn.call(obj, arr[i], i, arr); if(result) { resultArr.push(arr[i]); } } return resultArr; } var arr = [1, 2, 3, 11, 13]; var resultArr = arr.myFilter(function(item, arr){ return item > 5 }) console.log(resultArr);//[11, 13]