1、基础说明
forEach():循环遍历数组中的每个元素,并将元素传递给回调方法。
map():主要功能是可以将一个数组中的元素转换为另外一种数据格式,并返回一个新的数组,也就是投影操作。
filter():主要的功能是根据一定条件过滤数组数据。具体实现,将数组中的每个元素传递给一个回调函数,经过设定的逻辑处理返回一个布尔值,过滤相关的元素。最终返回一个新的数组。注意的是该方法不会对空数组进行检测、不会改变原始数组。
find():主要功能用于查找符合指定条件的第一个数组元素,并返回该元素。如果没有找到匹配的元素,则返回undefined。注意这里返回的是一个元素对象,filter()返回的是数组。
some():判断数组中是否有元素满足条件,只要有一条满足则返回true。
every():判断数组中所有元素是否满足条件,满足则返回true。
2、forEach()、map()、filter()、find() 基础语法:
array.forEach(function(element, index, arr), thisValue)
array.map(function(element, index, arr), thisValue)
array.filter(function(element, indedx, arr), thisValue)
array.find(function(element, indedx, arr), thisValue)
注释:
element:必选参数,当前的循环的元素值。
indedx:可选参数,当前元素的索引值,从0开始。
arr:可选参数,当前元素属于的数组对象。
thisValue:用于指定回调函数在执行时的this值。
3、案例
初始化一些案例数据
let arr = [1,2,3,4,5,6,7,8];
let scores = [{Id:1, Name:"张三", Score:98, Subject:"语文"},
{Id:2, Name:"李四", Score:80, Subject:"数学"},
{Id:3, Name:"王五", Score:85, Subject:"语文"},
{Id:4, Name:"李大奎", Score:58, Subject:"数学"},
{Id:5, Name:"吴仁星", Score:45, Subject:"英语"},
{Id:6, Name:"陈士楷", Score:79, Subject:"语文"}];
let students = [{Id:1,Name:"张三",Age:"15",Sex:"男"},
{Id:2,Name:"王五",Age:"16",Sex:"女"},
{Id:3,Name:"吴仁星",Age:"23",Sex:"男"},
{Id:4,Name:"李四",Age:"13",Sex:"女"}];
实际案例
1、forEach()循环遍历
arr.forEach((element, index, arrs) => {
console.log(element)
})
2、map()
//arr数组内元素乘以3
let ret = arr.map(c => { return c*3 })
//取出成绩数据,只要姓名和成绩元素
//方式一:
let ret = scores(c => {
let item = {
name:c.Name,
score:c.Score
}
return item
})
//方式二:
let ret2 = scores.map(c => ({
name:c.Name,
score:c.Score
}))
3、filter()
//删除小于等于3的数据
let ret = arr.filter(c => (c > 3))
//过滤出成绩不合格的数据
let fail = scores.filter(c => c.Score < 60)
4、find()
//找出张三的成绩数据
let ret = scores.find(c => c.Name == "张三")
5、every()
//判断数组中元素都大于0
let ret = arr.every(c => (c > 0))
6、some()
//判断数组中是否有元素满足条件
let ret = arr.some(c => (c = 1))
4、高阶案例
在实际开发中,经常会有求两个数组的交集、差集这样的需求。 比如根据学生数组中出现的学生名称元素,过滤成绩数据。当然简单的for循环也可以实现功能,但代码的可读性就没那么好,而且代码量多。
let ret = scores.filter(f => students.map(m => { return m.Name }).some(s => s == f.Name))