实现常用的数组方法
myForEach
Array.prototype.myForEach = function (callBack) {
let _arr = this
for(let i = 0; i < _arr.length; i++){
callBack.call(this, _arr[i], i,_arr)
}
}
const arr = [1, 2, 3]
arr.myForEach((item,index,arr) => {
if(item === 1){
arr[index] = 10
}
})
console.log('a===>', arr)
myMap
Array.prototype.myMap = function (callBack) {
const _arr = this
let newArr = []
for (let i = 0; i < _arr.length; i++) {
let result = callBack.call(this, _arr[i], i, _arr)
newArr.push(result)
}
return newArr
}
const arr = [
{
name: '张山',
age: 18
},
{
name: '李四',
age: 10
}
]
const newArr = arr.myMap(item => {
return {
...item,
sex: '男'
}
})
console.log('result===>', newArr, arr)
myFilter
Array.prototype.myFilter = function (callBack) {
const _arr = this
const _newArr = []
for (let i = 0; i < _arr.length; i++) {
let result = callBack.call(this, _arr[i], i, _arr)
if (result) _newArr.push(_arr[i])
}
return _newArr
}
const arr = [1, 2, 3]
const newArr = arr.myFilter(item => item !== 3)
console.log('filter===>', newArr, arr)
myReduce
Array.prototype.myReduce = function (cb, initVal = undefined) {
const _arr = this
let i = -1
if (!initVal) {
i = 0
initVal = _arr[0]
}
while (++i < _arr.length) {
initVal = cb.call(this, initVal, _arr[i], i, _arr)
}
return initVal
}
const arr = [100, 200, 300]
const num = arr.myReduce((acc, cur) => {
return acc += cur
},100)
console.log(num)
const arr1 = [ {name: '张山', age: 19}, {name: '张山', age: 19} ]
const tem = {}
const newArr1 = arr1.myReduce((acc,cur) => {
if (!tem[cur.name]) {
tem[cur.name] = true;
acc.push(cur);
}
return acc
}, [])
console.log('newArr1====>', newArr1)
myFindIndex
Array.prototype.myFindIndex = function (cb) {
var _arr = this
i = -1
initIndex = -1
while (++i < _arr.length) {
let result = cb.call(this, _arr[i], i, _arr)
if (result) {
initIndex = i
i = _arr.length
}
}
return initIndex
}
const arr = [1,2,3]
const index = arr.myFindIndex(item => item === 3)
console.log('index===>',index)