全部 / 前端 / 技术 · 2022年2月23日 0

reduce 求对象数组的和

广告位招租 (vx: ghostcode, 备注:网站广告)

reduce 计算数字数组之和很方便:

let sum = [0, 1, 2, 3].reduce(function (previousValue, currentValue) {
  return previousValue + currentValue
})
// sum is 6

但若是对象数组:

    var data = [
        {
            "label": "碱工段",
            "value": 0
        },
        {
            "label": "氯工区",
            "value": 0
        },
        {
            "label": "乙炔工段",
            "value": 0
        },
        {
            "label": "氯乙烯工段",
            "value": 0
        },
        {
            "label": "聚合工区",
            "value": 0
        },
        {
            "label": "公用工段",
            "value": 0
        },
        {
            "label": "设备管理工段",
            "value": 0
        },
        {
            "label": "成品工段",
            "value": 0
        }
    ]

若此时还用上面直接写会得到:null。正确做法需要稍微处理一下:

var total = data.reduce((prevValue,currentValue)=>{
    return prevValue + currentValue.value
},0)

关键是:

  1. 初始值0,
  2. 写成 preValue,而非 preValue.value

官方文档已经指出:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#sum_of_values_in_an_object_array

StackOverflow 上也有一个相关的提问:

https://stackoverflow.com/questions/5732043/how-to-call-reduce-on-an-array-of-objects-to-sum-their-properties

其中两个方法很有意思:

可以看出,需要构造成和原单个数组里的对象相同的结构就成。