用reduce求和sql
const sum = [1,2,3,4,5,6].reduce((v,t)=>{ return v+t; //第一次v=0,t=1
//第二次v= 0+1,t=2
//第三次v=1+2,t=3......
},0)//reduce传入两个值,第一个是个函数,第二个是初始值
map处理字符串而后用reduce数据库
const joined = 'this-is-an-example'; joined .split('-') .map( word => {//用map将每一个单词的第一个字符变成大写
const [head,...others] = word console.log(head,others); return head.toUpperCase() + others.reduce((x,y) => x+y,'') }) .reduce( (s,word)=>{ console.log('word=='+word); return s+' '+word; }) console.log(joined);
map/reduce处理sql数组
本质上全部数据处理过程(sql过程)都是map/reduce,因此能够使用map/reduce完成大量操做。而高阶函数让咱们能够最大化复用这个计算过程函数
//全部数据处理都是sql,用map/reduce完成一些sql操做 //假设数据库中有一张成绩单,以下
let students = { {id:1,name:'lucy',score:99,class:'a'}, {id:2,name:'lily',score:88,class:'b'} } let selected = students.map( student => { return {name:student.name}//最终只会输出name这一字段的值
}) console.log(selected); //好比筛选全部分数大于80的学生 即select name from students where score>80
let selected2 = students.reduce( (list,student) => { if(student.score > 80){ list = [...list,student] } return list; },[]) console.log(selected2); /*===================================================*/
//对上述条件筛选的另外一思路 map/reduce与高阶函数 //先把函数提取出来,此时并无用到高阶函数
let selectScoreLargerThan80 = (list,student) => { if(student.score > 80){ list = [...list,student]; } return list; } //const selected_2 = students.reduce(selectScoreLargerThan80,[]) //定义一个高阶函数filter,用于生成筛选条件
const filter = (prediction) => { return (list,item) => { if(prediction(item)){ list = [...list,item]; } } } //使用filter增长筛选条件
const selectScoreLargerThan80_2 = filter(item => item.score > 60) const selected_2_2 = students.reduce(selectScoreLargerThan80,[]) /*=========================================*/
//按照分数排序(倒序) //插入排序 select * from students order by score desc
const sorted = students.reduce( (list,student) => { let i = 0; for(;i<list.length;i++){//这里是插入的过程,排序条件是可变的,因此能够把这部分封装到一个高阶函数
if(list[i].score < student.score) break; } return [...list.slice(0,i),student,...list.slice(i,list.length)];//插入排序
},[]) /*========================================*/
//按照班级进行排序(groupby),而后求最大分数,插入排序 // select max(score) from students group by class
//将学生按照class分组
const grouped = students.reduce( (groups,student) => { if(!groups[student.class]){ groups[student.class] = {key:student.class,values:[]} } groups[student.class].values.push(student) return groups },{}) //提取为数组
const arrGroups = Object.values(grouped); //计算每一个分组的最大值
const final = arrGroups.map(group => { return { class:group.key, max:group.values.reduce( (a,b) => { return b.score > a ? b.score : a; },0) } }) console.log(final); /*===========================*/
//使用原生的filter与find
const selected = students.filter(student => student.score > 60) const student = students.find(student => student.id === 5) const sorted = students.sort((student1,student2) => student1.score < student2.score )
整理自魏蒙老师视频this