【问题标题】:How to sum the array of object values and assigned them to the relevant key name如何对对象值数组求和并将它们分配给相关的键名
【发布时间】:2022-01-21 21:58:13
【问题描述】:

我需要了解执行此操作的最简单方法。 我有一个对象数组:

const data = [
  {
    group: 'A',
    incomes: {
      "2019-12": 100,
      "2020-12": 200,
      "2021-12": 15
    }
  },
  {
    group: 'B',
    incomes: {
      "2019-12": 25,
      "2020-12": 50,
    }
  }
]

我想要得到的是一个简单的对象,它的键是 data.incomes 中的月份,值是相对月份值的总和,所以最终结果如下所示:

const totalIncomes = {
  "2019-12": 125,
  "2020-12": 250,
  "2021-12": 15
}

谁能一步一步给我解释一下吗?

【问题讨论】:

    标签: javascript arrays object filtering


    【解决方案1】:

    使用 reduce 和 forEach 解决

    在reduce 函数中,我在incomes 对象/属性的键数组上运行forEach。对于作为日期的每个键,我正在检查 reduce 函数的累加器是否包含每个日期的属性,如果没有则创建。创建属性后,我将当前日期属性的值相加。

    const data = [
      {
        group: 'A',
        incomes: {
          "2019-12": 100,
          "2020-12": 200,
          "2021-12": 15
        }
      },
      {
        group: 'B',
        incomes: {
          "2019-12": 25,
          "2020-12": 50,
        }
      }
    ]
    
    const totalIncomes = data.reduce((acc,curr)=> {
        Object.keys(curr.incomes).forEach((key, index) => {
       if(!acc[key]){
            acc[key] = 0;
       }
       acc[key]+=curr.incomes[key]
      });
       return acc;
    },{})
    
    console.log(totalIncomes)

    【讨论】:

    • 非常感谢!我尝试使用 Object.entries() 而不是 Object.keys 做几乎相同的事情,这就是我遇到错误的地方。
    • @cmgchess 这个答案可以通过添加一些有用的解释来改进......
    • @Gass 我很着急。添加了一些解释
    【解决方案2】:

    也许这不是漂亮的解决方案,但你可以这样做,这个功能当然不是必需的。

    const data = [
      {
        group: "A",
        incomes: {
          "2019-12": 100,
          "2020-12": 200,
          "2021-12": 15,
        },
      },
      {
        group: "B",
        incomes: {
          "2019-12": 25,
          "2020-12": 50,
        },
      },
    ];
    
    getterInformation(data);
    
    function getterInformation(object) {
      let objectWithCalculatedValues = {};
    
      object.forEach((items) => {
        for (const key in items.incomes) {
          if (objectWithCalculatedValues[key] === undefined) {
            objectWithCalculatedValues[key] = 0;
          }
    
          objectWithCalculatedValues[key] += items.incomes[key];
        }
      });
    
      console.log(objectWithCalculatedValues);
    }
    

    【讨论】:

    • 也许它不是最漂亮的,但它很有效,而且我也很容易理解,所以绝对没问题。?谢谢。
    • @Galterius 您可以通过减少变量名的长度来轻松改进它。它们应该是描述性的,但不是那么多;)
    • 我知道,有时我在命名变量时遇到问题 :))))
    【解决方案3】:

    假设此信息可能对可能无法获得必要指导的读者有用(由于各种可能的原因),以下是实现目标的一种可能方法(解决方案):

    const aggregateIncomesByMonth = () => (
      data.map(d => Object.entries(d.incomes).map(([k, v]) => ({
        key: k,
        value: v
      }))).flat().reduce((fin, itm) => ({
        ...fin,
        [itm.key]: (fin[itm.key] || 0) + itm.value
      }), {})
    );
    

    说明

    1. 仅从data 数组中提取incomes
    2. 对于每个income对象,获取键值对,转化为结构{key: 20yy-mm, value: nn}的另一个对象
    3. 使用 .flat() 将步骤 2 的结果转换为一维数组
    4. 对于key(即20yy-mm)匹配的情况,使用.reducevalue 求和。

    代码-sn-p

    const data = [{
        group: 'A',
        incomes: {
          "2019-12": 100,
          "2020-12": 200,
          "2021-12": 15
        }
      },
      {
        group: 'B',
        incomes: {
          "2019-12": 25,
          "2020-12": 50,
        }
      }
    ];
    
    const aggregateIncomesByMonth = () => (
      data.map(d => Object.entries(d.incomes).map(([k, v]) => ({
        key: k,
        value: v
      }))).flat().reduce((fin, itm) => ({
        ...fin,
        [itm.key]: (fin[itm.key] || 0) + itm.value
      }), {})
    );
    
    console.log(aggregateIncomesByMonth());

    【讨论】:

      【解决方案4】:

      我的方法是解构数组。这样我就可以在变量A 中获得 A 组收入的所有数据,B 也是如此。

      然后我做一个双循环来比较两个对象的数据,看看日期是否匹配。如果是这样,将收入相加并将数据添加到total 对象。

      const data = [
        {
          group: 'A',
          incomes: { "2019-12": 100, "2020-12": 200, "2021-12": 15 }
        },
        {
          group: 'B',
          incomes: { "2019-12": 25, "2020-12": 50 }
        }
      ]
      
      let A, B, total = {};
      
      [A, B] = [data[0].incomes, data[1].incomes]
      
      for(const date in A){
        for(const d in B){
         total[date] = date === d ? A[date] + B[date] : A[date]
        }  
      }
      
      console.log(total)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 2015-03-29
        • 2019-05-01
        • 2015-07-31
        • 1970-01-01
        相关资源
        最近更新 更多