Skip to content

回调函数

有以下数据:

js
var students = [
  {
    id: 988985,
    name: '梁平',
    sex: '女',
    age: 15,
    address: '安徽省 淮南市',
    tel: '12957961008',
  },
  {
    id: 299422,
    name: '邱杰',
    sex: '男',
    age: 25,
    address: '辽宁省 本溪市',
    tel: '12685726676',
  },
  {
    id: 723972,
    name: '王超',
    sex: '女',
    age: 14,
    address: '新疆维吾尔自治区 阿克苏地区',
    tel: '15277794541',
  }
];

需要得到以下数据:

js
//1.得到所有女生
//2. 得到所有20岁以下的女生
// 3.得到所有姓赵的同学
// 4.得到所有居住在黑龙江的女生

// 以第一个为解
let students=[];
for(let i = 0; i <students.length; i++){
    if(students[i].sex === '女'){
        students.push(students[i]);
    }
}
console.log(students);

现在解决第二题,会发现,所有的格式都一样,只是判断条件不同,能否封装一个函数,传入判断条件,返回结果呢?

可以,封装一个函数:

js
function filter(students,callback){
    let result=[];
    for(let i = 0; i <students.length; i++){
        if(callback(students[i])){//回调函数作为条件,且还可以把某些数据作为参数传递给用户
            result.push(students[i]);
        }
    }
    return result;
}

以上就是将一个函数当为参数传递到函数内,然后在函数内部合适的时机去调用这个函数,还可以把内部的某些数据当作参数传递给用户,至于用户用否,完全取决于个人。

那么接下来的题就都迎刃而解了:

js
// 得到所有20岁以下的女生
const res = filter(students,function(student){
    return student.sex === '女' && student.age < 20;
});

// 得到所有姓赵的同学
const res2 = filter(students,function(student){
    return student.name[0] === '赵';
});

// 得到所有居住在黑龙江的女生
const res3 = filter(students,function(student){
    return student.address.indexOf('黑龙江') !== -1 && student.sex === '女';
});

MIT License