27.实现自定义数组API:map和filter

filter实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// filter实现
let arr = [3, 2, 6, 7, 6,10];
Array.prototype.myFilter = function (fn) {
let newArray = [];
for(let i = 0; i < this.length; i++){
let result = fn(this[i], i, this);
if(result){
newArray.push(this[i]);
}
}
return newArray;
}
var filterDeal=function(value,index,obj){
if(value/2>2.5)
return true;
}

var neaArr=arr.myFilter(filterDeal)

console.log(neaArr);//[ 6, 7, 6, 10 ]

要点:

  • Array.prototype.myFilter这个函数的参数要传进处理数组的函数
  • 经过filter处理的函数,只有符合要求的元素,所以长度可能和原来的不一样

map实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
let arr = [3, 2, 6, 7, 6,10];
Array.prototype.myMap = function (fn) {
let newArray = new Array(this.length);
newArray.fill(undefined);
for(let i = 0; i < this.length; i++){
let result = fn(this[i], i, this);
if(result !== undefined){
newArray[i] = result;
}
}
return newArray;
}

var mapDeal=function(value,index,obj){
if(value/2>2.5)
return value;
return;
}

var neaArr1=arr.myMap(mapDeal)


console.log(neaArr1);//[ undefined, undefined, 6, 7, 6, 10 ]
console.log(neaArr1.length);//6
  • 经过map处理的函数,长度和原来的一样,undefined值是因为不符合条件