實現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]