js函数式编程(高阶函数)
完成几个数组高阶函数的练习,包括map
every
some
reduce
然后具体代码如下
这个是reduce
的代码;具体作用是统计一个字符串数组中每个字符出现的次数;
function countWords(arr){
return arr.reduce(function(prev,next){
prev[next] = (prev[next] + 1) || 1; //理解这里关键,值得注意的是prev[next]
return prev;
},{});
}
module.exports=countWords;
重点解释一下第三行* prev[next] = (prev[next] + 1) || 1
* 一开始实在不理解这是什么鬼? 比如有这样一个字符数组[a,s,a,d,a,d,d,w]
注意最后,传递了一个空对象{}
作为init 这就是最初的空对象 然后可以看到的是 prev[next] prev访问next属性也即是第一个元素a
然后再看等号右边,prev[next]+1
这个值是等于NAN的 所以1 ,再看第三个元素a
这个原来已经有一个a对象了 ,所以prev[next]的值是可以取到了 就在原来基础之上+1;
想想第一个next 是 a; 然后将a赋值为1;第二个元素为s 将s赋值为1 ;第三个元素为a,对象里面已经有a属性了 ,所以a属性值+1,多多理解!!!
这个是every
和some
的代码;具体是比对一个对象是否是一个对象的子集
function checkUsersValid(goodUsers) {
return function allUsersValid(submittedUsers) {
var validArr=goodUsers.map(function(item){
return item.id;
});
return submittedUsers.every(function(index){
return validArr.some(function(item){
return item==index.id;
})
})
};
}
module.exports = checkUsersValid;
这个代码比较好理解,那我就不解释了哈
再看一个filter
的;具体是一个过滤一个对象数组,然后找出message长度大于50的
module.exprots=function getShortMessages(obj){
return obj.filter(function(index){
return index.messages.length<50
}).map(function(index){
return index.messages
})
};
input:[{meaasges:"qwsdqwwfr"},{meaasges:"qwfgsdfgr"},{meaasges:"fqsdfnr"},{meaasgesz:"ioujqsdfr"}]
解释下为什么要先filter, 先filter之后得到还是对象数组再map之后就得到message数组了