JS数组/对象数组/对象数组相同key值求和(Reduce的灵活使用)

2,707 阅读1分钟
  1. 数组求和
  2. 累加对象数组中的某项数据
  3. 累加对象数组中相同key值的某项数据 源数组:
const data = [1, 2, 3, 4, 5]

const objArray = [
    {id: 1, number: 10},
    {id: 2, number: 20}, 
    {id: 3, number: 30},
    {id: 4, number: 40},
    {id: 5, number: 50}
]

const someObjArray = [
    {id: 1, type: 1, name: 'zhangsan', value: 10},
    {id: 1, type: 1, name: 'lisi', value: 10},
    {id: 1, type: 1, name: 'wangwu', value: 10},
    {id: 1, type: 1, name: 'zhangsan', value: 20},
    {id: 1, type: 1, name: 'wangwu', value: 30},
    {id: 1, type: 1, name: 'zhangsan', value: 30},
]
  • 数组求和 (所有的数据累加和)
// 常见的数组求和方式 
function sum (arr) {
    const len = arr.length  
    let result = 0  
    for (let index = 0; index < len; index++) {
        result += arr[index]  
    }  
    return result
}
const res = sum(data) // 15

// reduce 数组求和
const reduceRes = data.reduce((acc, cur) => acc + cur, 0) // 15
  • 累加对象数组中的某项数据 (求所有的number和)
// 常见的数组求和方式
function sum (arr) {  
    const len = arr.length  
    let result = 0  
    for (let index = 0; index < len; index++) { 
       result += arr[index].number
    }  
    return result
}
const res = sum(objArray)   // 150

// reduce 数组求和
const reduceRes = objArray.reduce((acc, cur) => acc + cur.number, 0)    // 150
  • 累加对象数组中相同key值的某项数据 (求相同name的value和)
// 常见的数组求和方式
function sum (arr) {  
  const len = arr.length
  let result = []
  for (let index = 0; index < len; index++) { 
    const {name, value} = arr[index]
    const someIndex = result.findIndex(item => item.name === name)
    someIndex === -1 && result.push({
      name,
      value
    })
    someIndex !== -1 && (result[someIndex].value += value)
  }  
  return result
}
const res = sum(someObjArray)
// [{name: "zhangsan", value: 60}, {name: "lisi", value: 10}, {name: "wangwu", value: 40}]

// reduce 数组求和
const reduceRes = someObjArray.reduce((result, cur, index) => {
  const { name, value } = cur
  const someIndex = result.findIndex(item => { return item.name === cur.name})
  someIndex === -1 && result.push({
     name,
     value
  })
  someIndex !== -1 && (result[someIndex].value += value)
  return result
}, [])
// [{name: "zhangsan", value: 60}, {name: "lisi", value: 10}, {name: "wangwu", value: 40}]

Array.prototype.reduce

Array.prototype.findIndex