蓝桥杯前端Web赛道-寻找小狼人
题目链接:0寻找小狼人 - 蓝桥云课 (lanqiao.cn)
题目要求:
其实通过题目要求以及题目中提供的gif可知,该题就是需要我们手动写出能够代替filter
函数的函数
我们先分析题目给出的代码:
let newcardList = cardList.myarray(
(item) => item.category == "werewolf"
);
在84行左右提供了这样一段代码
回忆一下原先filter
函数是怎么使用的
const words = ['spray', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter((word) => word.length > 6);
filter
的括号里提供的是一个回调函数,这个回调函数会返回true
或者false
然后再通过一些逻辑,真正完成过滤的要求
根据提供的代码对比,我们就能知道
(item) => item.category == "werewolf"
以上代码就是条件,满足这个条件就会返回true
否则 则是false
由于filter
函数返回的是一个新数组,所以我们还需要在内部定义一个新数组
// 返回条件为真的新数组
Array.prototype.myarray = function (cb) {
// TODO:待补充代码
let arr = []
};
题目中的cb
就是这个新数组应该满足的条件,我们可以通过这个回调函数的特性来进行过滤。
首先我们需要把数组的每一项进行遍历
Array.prototype.myarray = function (cb) {
// TODO:待补充代码
let arr = []
this.forEach((item,index)=>{
})
};
这个地方为什么使用this
呢,因为谁调用这个myarray
函数那么this
就指向谁
题目中调用myarray
函数的是cardList
这个数组,于是此时的this
,其实就是cardList
然后我们利用回调函数进行判断,最后返回新的数组
// 返回条件为真的新数组
Array.prototype.myarray = function (cb) {
// TODO:待补充代码
let arr = []
this.forEach((item,index)=>{
if(cb(this[index])){
arr.push(item)
}
})
return arr;
};
这里的
if(cb(this[index])){
arr.push(item)
}
意思就是,传入当前元素到cb
里,如果cb
返回true
则证明当前元素满足要求,将当前元素添加到结果数组arr
中
至此完成本题要求