手写数组方法(三):filter

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

语法

array.filter(function(item,index,arr), ins)

参数

参数1:回调函数(必需

参数2:传递给回调函数的this指针(可选)

回调函数

参数1:当前元素

参数2:当前元素的下标

参数3:原数组

let list = [1, 2, 3];
list.filter(function (item, index, arr) {
    console.log(item, index, arr);
});

1bf69b5aa09e2ea42ac8ef27cb4df6b.png

this指针

let list = [1, 2, 3];
let ins = { haha: '我的传进来的this' };
list.filter(function () {
    console.log(this);
}, ins);

cb1f057187fcbef71aef8626698aabd.png

如果不传,默认是全局window变量:

let list = [1, 2, 3];
list.filter(function () {
    console.log(this);
});

58656907d52805bc3e94bafa40e1c87.png

返回值

返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。

let list = [1, 2, 3];
let res = list.filter(item => item > 1);
console.log(res);

c85c00282a6df690504427a6982fba1.png

let list = [1, 2, 3];
let res = list.filter(item => item > 3);
console.log(res);

660f76324faf8280776f01fa14aa8e1.png

使用

简单过滤

筛选出性别为男的数据:

let list = [
    { sex: 'male', score: 90, name: 'Jane' },
    { sex: 'male', score: 80, name: 'Jay' },
    { sex: 'female', score: 90, name: 'Lili' }
];
let res = list.filter(item => item.sex === 'male');
console.log(res);

474da0b4b1dcdcc1f1e5decaafe9807.png

双重过滤

在条件中写

let list = [
    { sex: 'male', score: 90, name: 'Jane' },
    { sex: 'male', score: 80, name: 'Jay' },
    { sex: 'female', score: 90, name: 'Lili' }
];
let res = list.filter(item => item.sex === 'male' && item.score >= 90);
console.log(res);

3e598d77d9e23d25e17e5dc2438868a.png

分两次filter

let list = [
    { sex: 'male', score: 90, name: 'Jane' },
    { sex: 'male', score: 80, name: 'Jay' },
    { sex: 'female', score: 90, name: 'Lili' }
];
let res = list.filter(item => item.sex === 'male').filter(item => item.score >= 90);
console.log(res);

705507f1c814fee34515606075d6cae.png

效果是一样的,个人是更偏向于在条件中一次性过滤出想要的数据,分多次filter一个是能够说明filter返回了一个新数组,因为数组才可以使用filter,另一个就是可能对于新手来说,更有助于认识filter的作用。

手写

理清需求

  • 函数接收2个参数,一个回调函数,一个this指向
  • 函数会遍历数组每一项,将符合条件的项筛选出来
  • 回调函数接收3个参数:当前元素、下标、原数组
  • 回调函数可通过函数的第二个参数改变this指向
  • 函数返回一个筛选后的数组,如果没有符合条件的项,则返回空数组 根据需求,不难写出以下代码:
Array.prototype._filter = function (callback, ins) {
    let res = [];
    for (let i = 0; i < this.length; i++) {
        if (callback.call(ins, this[i], i, this)) {
            res.push(this[i])
        }
    }
    return res;
};

测试

let res = [1, 2, 3]._filter(function (item, index, arr) {
    console.log(item, index, arr);
    console.log(this);
    return item > 1;
}, { o: 100 });
console.log(res);

1f6c1c5ba1ea61a24b7a9610564e6c9.png

let res = [1, 2, 3]._filter(item => item > 3);
console.log(res);

12b5375e1dbd69981b3b8e459df3c61.png 返回的结果完全符合预期,以上就是手写filter的核心代码,是不是so easy

结语

今天关于数组filter的介绍就讲到这里,关注我获取更多有关数组方法的讲解,后续会持续更新。我是末世未然,一个爱折腾的新晋奶爸,祝好