资讯详情

JavaScript的数组中reduce的9种用法

total 必要。初始值, 或计算结束后的返回值。 currentValue 必需。当前元素 currentIndex 可选。当前元素的索引 arr 可选。当前元素所属的数组对象。 initialValue 可选。传递给函数的初始值

let arr = [1,2,3,4,5]; ///每次回total current的值 给total。 // 0 为初始值 ,若初始值为1 的话 最终结果必须是(1 2 3 4 5)=15 再 1 = 16 let sum = arr.reduce(function(total,current){ 
            return total current },0) //箭头函数写法: // let sum = arr.reduce((total,current)=> total current,0) console.log(sum); 

let arr = [{ 
       x:1},{ 
       x:2},{ 
       x:3}] //total current.x : 使用 arr 数组的 属性x 的值 进行累加。total 初始值为0 let sum = arr.reduce(function(total,current){ 
            return total current.x },0) //箭头函数: // let sum = arr.reduce((total,current)=> total current.x,0) console.log(sum); 

let arr = [[0,1],[2,3],[4,5]]
//初始值是空数组:[], 用数组拼接 返回拼接后的新数组
let arr1 = arr.reduce(function(newarr,current){ 
       
    return newarr.concat(current)
},[])
//箭头函数:
// let arr1 = arr.reduce((newarr,current)=> newarr.concat(current),[])
console.log(arr1);

let arr = ['filter','reduce','map','foreach','reduce']
//obj 初始值为对象,如果遍历的元素在该对象中, 它的值就+1
//如果不在 就是第一次出现 它的值为1
let count = arr.reduce(function(obj,current){ 
       
    //将current当做对象的键名 key:value 的key 
    if(current in obj){ 
       
        obj[current]++;
    }else{ 
       
        obj[current]=1;
    }
    return obj;
},{ 
       })
console.log(count);

let arr = [
    { 
       name:'zs',age:18},
    { 
       name:'ls',age:19},
    { 
       name:'zw',age:18}
]
let t = 'age'
let res = arr.reduce(function(accobj,obj){ 
       
    //每次循环拿到的{name:'zs',age:18} 只需用到 age的值来分类,作为accobj 的键名
    var key = obj[t];// 当前age作为键名
    //先给accobj的键名为key 赋value值 ,用数组存value,首为空数组,只有它是数组才能用push
    if(!accobj[key]){ 
       
        accobj[key] = []  
    } 
    // 用数组存这个value push方法加入
    accobj[key].push(obj);
    return accobj
},{ 
       })
console.log(res);

let user = [
    { 
       name:'zs',books:['The tiny times','The ordinary world'],age:18},
    { 
       name:'ls',books:['Dumb house','War ahd peace'],age:19},
    { 
       name:'ww',books:['Conan','Border town'],age:20}
]
//初始为数组['default'] 之后将current.books也就是数组 复制到数组pre中
let allboooks = user.reduce(function(pre,current){ 
       
    //...current.books :把数组展开,跟pre合并
    return [...pre,...current.books]
},['default'])
console.log(allboooks);

let arr = [1,2,1,2,3,4,7,6,3,1];
let res = arr.sort().reduce((init,current)=>{ 
       
    //初始默认为空数组
    //还没有添加 或者 已经有值了 且上一个传入即数组init最后一个不等于当前,就加入
    //因为sort已经排好序了 重复的会挨在一起, 重复时就不把它push
    if(init.length===0||init[init.length-1]!==current){ 
       
        init.push(current)
    }
    return init
},[])
console.log(res);

//函数组成数组
const arrPro = [pro1,pro2,fun,pro4]
run(arrPro,10).then(console.log)//返回的promise对象成功态resolve(360) then打印

function run(arr,input){ 
       
    return arr.reduce(
        //[pro1,pro2,fun,pro4] 循环的第一个currentfun 是函数pro1,也就是第一次:
    //Promise.resolve(10).then(pro1) :把10 传到pro1中,返回promise对象,把10*1.5=15 resolve
    //第二次:Promise.resolve(15).then(pro2) :把15传到 pro2 ,返回promise对象。 15*2 = 30 
    //第三次:Promise.resolve(30).then(fun) 把30 传到fun ,30*3=90,被wrapped成promise返回
    //第四次:Promise.resolve(90).then(pro4)把90 传到pro4,90*4=360,返回promise对象
        (prom,currentfun)=> prom.then(currentfun),
        //初始值是promise对象 成功态
        Promise.resolve(input)
    );
}
function pro1(a){ 
       
    return new Promise((resolve,reject)=>{ 
       
        resolve(a*1.5)
    })
}
function pro2(a){ 
       
    return new Promise((resolve,reject)=>{ 
       
        resolve(a*2)
    })
}
function fun(a){ 
       
    return a*3;
}
function pro4(a){ 
       
    return new Promise((resolve,reject)=>{ 
       
        resolve(a*4)
    })
}

//箭头函数
// const double = x => x + x
// const triple = x => 3 * x
//...functions 收集传入的两个函数为数组functions
// const pipe = (...functions) => input=> functions.reduce(
// (acc, fn) => fn(acc),
// input
// )
const double =function(x){ 
       
    return x+x
}
const triple = function(x){ 
       
    return 3*x
}
const pipe  = function(...functions){ 
       
    //返回函数 
    return function(input){ 
       // 调用函数时 传入 input=6 作为初始值
        return functions.reduce(
            //functions数组 有两个元素 函数 ,第一次循环时 为函数double 
            //fn(acc) : double(6) 调用 函数 返回 6*2=12
            //第二次循环 fn(acc) : triple(12) 调用函数 返回12*3=36
            //将36 返回 输出
            (acc, fn) => fn(acc),
            input
        )
    }
}
// (函数,函数)
const multiply6 = pipe(double, triple) //返回结果是函数 
//相当于multiply6 为函数 :
// function multiply6 (input){ 
       
// return 数组.reduce(
// (acc, fn) => fn(acc),
// input
// )
// }

// Usage
let sum = multiply6(6) //调用 multiply6 函数
//即相当于let sum = triple( double(6) );
console.log(sum);//36

详情参考MDN之reduce

标签: 32364ahd1传感器om9

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台