记录一个操作需求(有关数组的合并)

161 阅读1分钟
  1:Object.keys()
  利用该方法可以获取到数组内的键,然后获取到的键会组成一个数组
  2:Object.values()
  利用该方法可以获取到数组内每一个键对应的值,然后组成一个数组
  
  现有一个arr数组,其中每一项都是一个对象,例如arr = [{ a: 1, b: 2 }, { a: 2, b: 3 }]
  现需要将arr中的每一项中的a相加,每一项中的b相加,然后赋值给arr1,得到的结果为arr1 = [{a:3,b:5}]
  
  方法一:
  var sum1 = 0
  var sum2 = 0
  arr.map((v, i) => {
    sum1 += Object.values(v)[0]
    sum2 += Object.values(v)[1]
  })
  arr1.push({ a: sum1, b: sum2 })
  console.log(arr1)
  该方法较为死板,只能用于arr中项数较为少的情况下
  
  方法二:
  var arr1 = []
  var arr2 = { a: 0, b: 0 }
  arr.forEach(item => {
    for (var key in item) {
      arr2[key] += item[key]
    }
  })
  arr1.push(arr2)
  console.log(arr1)
  该方法相比与方法一更加好一点,但是若arr中某一项或者某几项中存在某个键而其余的项没有,获取得到的最终结果与设置的arr2挂钩,需要根据得到的最终结果去设置arr2的数据(增加键或减少键)
  
  方法三:
  var arr1 = []
  var arr2 = {}
  arr.forEach(item => {
    for (var key in item) {
      if (!arr2[key]) {
        arr2[key] = 0
      }
      arr2[key] += item[key]
    }
  })
  arr1.push(arr2)
  console.log(arr1)
  该方法加入一个判断,去获取到不是每一项都存在的键,适用于所有情况
  
  方法四:
  var arr1 = []
        arr1.push(
    arr.reduce(
      (acc, item) => (
        Object.keys(item).forEach(
          n => (acc[n] = acc[n] ? acc[n] + item[n] : item[n])
        ),
        acc
      ),
      {}
    )
  )
  console.log(arr1)
  该方法灵活,不需要在意arr中有多少项,每一项中含有多少个键也不会影响,也会按照累加的形式输出,不过需要理解reduce方法
  该方法的链接地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce