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,多多理解!!!


这个是everysome 的代码;具体是比对一个对象是否是一个对象的子集

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数组了

posted on 2016-03-07 23:22  liuestc  阅读(438)  评论(0编辑  收藏  举报