map
函數接收一個函數做爲參數,做爲參數的函數接收三個參數值,分別是遍歷數組的每一項元素,元素的索引和數組自己。這三個參數恰好和reduce函數接收的第一個函數參數的第二、三、4個參數是對應的。這是實現的核心數組
實現思路是,將每次遍歷的元素,做爲傳入的函數的參數,並將函數執行的結果放入新的數組中。函數
Array.prototype._map = function (callback) {
if(typeof callback === 'function') {
return this.reduce((prev,item,index,arr) => {
prev.push(callback(item, index, arr))
return prev
}, [])
} else {
console.log(new Error('callback is not function'))
}
}
let val = [1, 5, 6]._map(item => item+ 1)
console.log(val); // [2, 6, 7]
複製代碼
實現filter
的思路和實現map
是一致的,只不過前者是一股腦的把執行結果全放入數組中,而filter須要作一個判斷:若是filter函數傳入的參數(參數是一個函數)執行後有返回值,即通過了檢驗,纔將遍歷的當前元素放入數組中,若是沒有返回值,就忽略ui
Array.prototype._filter = function (callback) {
if(typeof callback === 'function') {
return this.reduce((prev,item,index,arr) => {
callback(item, index, arr) ? prev.push(item) : null
return prev
}, [])
} else {
console.log(new Error('callback is not function'))
}
}
let val = [1, 5, 6]._filter(item => item > 2)
console.log(val); // [5, 6]
複製代碼
let arr = [1, 2, 3, 4, 5]
console.log(arr.reduce((prev, cur) => Math.max(prev, cur))); // 5
console.log(arr.reduce((prev, cur) => Math.min(prev, cur))); // 1
複製代碼
let arr = [1, 2, 3, 1, 1, 2, 3, 3, 4, 3, 4, 5]
let result = arr.reduce((prev, item, index, arr) => {
!prev.includes(item) && prev.push(item);
return prev
}, [])
console.log(result); //[1, 2, 3, 4, 5]
複製代碼
let arr = [1, 2, '3js', [4, 5, [6], [7, 8, [9, 10, 11], null, 'abc'], {age: 58}, [13, 14]], '[]', null];
function f(arr) {
if(Array.isArray(arr)) {
return arr.reduce((prev, item) => {
return Array.isArray(item) ? prev.concat(f(item)) : prev.concat(item)
}, [])
} else {
throw new Error("arr + ' is not array'")
}
}
複製代碼
結果: this