js中的reduce()函数

定义:

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。对空数组是不会执行回调函数的。

案例

1.数组求和

    // 1.数组求和
    var arr = [1,5,8,6,15,78,65,25,48,55]
    var sum = arr.reduce(function(total,currentValue){
        return total+currentValue;
    }, 0);
    console.log(sum);//306
    var eachSum = 0;
    arr.forEach(function(currentValue){
        eachSum += currentValue;
    })
    console.log(eachSum);//306

2.合并二维数组

    //2.合并二维数组
    var twoArr = [['mu','zi'],['dig','big'],['lucky','jiji']];
    var oneArr = twoArr.reduce(function(total,currentValue){
        // console.log(total)
        return total.concat(currentValue);
    }, [])
    console.log(oneArr);//["mu", "zi", "dig", "big", "lucky", "jiji"]

3.统计一个数组中重复的单词的个数:

    //3.统计一个数组中有多少个不重复的单词:
    // 不用reduce时: 
    var arr = ["apple","orange","apple","orange","pear","orange"]; 
    function getWordCnt(){ 
        var obj = {}; 
        for(var i= 0, l = arr.length; i< l; i++){ 
            var item = arr[i]; 
            obj[item] = (obj[item] +1 ) || 1; 
        } 
        return obj; 
    }
    console.log(getWordCnt());//{apple: 2, orange: 3, pear: 1}
    // 用reduce时: 
    var arr = ["apple","orange","apple","orange","pear","orange"]; 
    function getWordCnt(){ 
        return arr.reduce(function(prev,next){ 
            prev[next] = (prev[next] + 1) || 1; 
            return prev; 
        },{}); 
    } 
    console.log(getWordCnt());//{apple: 2, orange: 3, pear: 1}

4.数组对象变对象  [{},{},{}] ==> {}

// [{1:'liming'},{2:'xiaohong'},{3:'xiaoming'}] => {1:'liming',2:'xiaohong',3:'xiaoming'}}

let arrObj = [{1:'liming'},{2:'xiaohong'},{3:'xiaoming'}];
let obj = arrObj.reduce((total,item) => {
    return Object.assign(total,item)
},{});
console.log(obj); // {1: 'liming', 2: 'xiaohong', 3: 'xiaoming'}

5.对reduce的理解:
reduce(callback,initiaValue)会传入两个变量,回调函数(callback)和初始值(initiaValue)。
假设函数有个传入参数,prev和next。 prev和next是你必须要了解的。
当没有传入初始值时,prev是从数组中第一个元素开始的,next是第二个元素。
但是当传入初始值(initiaValue)后,第一个prev将是initivalValue,next将是数组中的第一个元素。
比如:

    // 4.对reduce的理解:
    var arr = ["apple","orange"]; 
    function noPassValue(){ 
        return arr.reduce(function(prev,next){ 
            console.log("prev:",prev); 
            console.log("next:",next); 
            return prev; 
        }); 
    } 
    
    function passValue(){ 
        return arr.reduce(function(prev,next){ 
            console.log("prev:",prev); 
            console.log("next:",next); 
            prev[next] = 1; 
            return prev; 
        },{});
    } 
    console.log("No Additional parameter:",noPassValue()); 
    console.log("----------------"); 
    console.log("With {} as an additional parameter:",passValue()); 
    
    /*
    VM415673:4 prev: apple 
    VM415673:5 next: orange 
    VM415673:4 prev: apple 
    VM415673:5 next: orange 
    VM415673:19 No Additional parameter: apple 
    VM415673:20 ---------------- 
    VM415673:13 prev: {} 
    VM415673:14 next: apple 
    VM415673:13 prev: {apple: 1} 
    VM415673:14 next: orange 
    VM415673:21 With {} as an additional parameter: {apple: 1, orange: 1}
    */

若有不足请多多指教!希望给您带来帮助!参考文献:链接

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值