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数组了
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号