Reduce 用法

102 阅读1分钟

1、语法

arr.reduce(callback,[initialValue]) 1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))

    ``2、currentValue (数组中当前被处理的元素)

    ``3、index (当前元素在数组中的索引)

    ``4、array (调用 reduce 的数组)

2、例子

var arr = [1, 2, 3, 4]; var sum = arr.reduce(function(prev, cur, index, arr) {

    ``console.log(prev, cur, index);

    ``return prev + cur;

})

console.log(arr, sum); 1 2 1

        `3 3 2`

        `6 4 3`

        `[1, 2, 3, 4] 10`

3、reduce的简单用法

var  arr = [1, 2, 3, 4];

var sum = arr.reduce((x,y)=>x+y)

var mul = arr.reduce((x,y)=>x*y)

console.log( sum ); ``//求和,10

console.log( mul ); ``//求乘积,24

4、reduce的高级用法

(1)计算数组中每个元素出现的次数

let names = [``'Alice'``, ``'Bob'``, ``'Tiff'``, ``'Bruce'``, ``'Alice'``];

let nameNum = names.reduce((pre,cur)=>{

  ``if``(cur ``in pre){

    ``pre[cur]++

  ``}``else``{

    ``pre[cur] = 1

  ``}

  ``return pre

},{})

console.log(nameNum); ``//{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

(2)数组去重

let arr = [1,2,3,4,4,1]

let newArr = arr.reduce((pre,cur)=>{

    ``if``(!pre.includes(cur)){

      ``return pre.concat(cur)

    ``}``else``{

      ``return pre

    ``}

},[])

console.log(newArr);``// [1, 2, 3, 4]

(3)将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]]

let newArr = arr.reduce((pre,cur)=>{

    ``return pre.concat(cur)

},[])

console.log(newArr); ``// [0, 1, 2, 3, 4, 5]

(4)将多维数组转化为一维

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]

const newArr = function(arr){

   ``return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])

}

console.log(newArr(arr)); ``//[0, 1, 2, 3, 4, 5, 6, 7]

(5)对象里的属性求和

var result = [

    ``{

        ``subject: ``'math'``,

        ``score: 10

    ``},

    ``{

        ``subject: ``'chinese'``,

        ``score: 20

    ``},

    ``{

        ``subject: ``'english'``,

        ``score: 30

    ``}

];

 

var sum = result.reduce(function(prev, cur) {

    ``return cur.score + prev;

}, 0);

console.log(sum) ``//60

(5)对象去重

let arr = state.Tabnav.reduce((v, i) => { obj[i.path] ? '' : (obj[i.path] = true && v.push(i)) return v }, [])