实现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]