【问题标题】:Creating a SUM of nested object values in JavaScript在 JavaScript 中创建嵌套对象值的总和
【发布时间】:2017-09-30 20:54:16
【问题描述】:

我正在使用以下代码查询 API,该 API 可以很好地返回 JSON 中的嵌套值:

const obj = response.data.map(function(item) {

return [item.id, item.jobNumber];
});

示例 JSON:

{
 "data": [
  {
     "id": 100,
     "jobNumber": 1,
     "jobTasks": [
        {
           "id": 12,
           "cost": {
              "amountString": 100
           },
           {
           "id": 13,
           "cost": {
              "amountString": 500
           }
         }
     }
  ]
},
  {
     "id": 101,
     "jobNumber": 2,
     "jobTasks": [
        {
           "id": 14,
           "cost": {
              "amountString": 100
           },
          {
           "id": 15,
           "cost": {
              "amountString": 200
           }
         }
     }]

}]
}

我现在想遍历嵌套的作业任务,并对每个作业的 item.jobTasks.cost.amountString 求和,以便返回以下内容:

  • JobNumber1:任务成本:600
  • JobNumber2:任务成本:300

【问题讨论】:

    标签: javascript arrays json object for-loop


    【解决方案1】:

    您可以使用Array#map() 创建一个新数组并使用Array#reduce()amountString 求和

    const apiJson = {"data":[{"id":100,"jobNumber":1,"jobTasks":[{"id":12,"cost":{"amountString":100}},{"id":13,"cost":{"amountString":500}}]},{"id":101,"jobNumber":2,"jobTasks":[{"id":14,"cost":{"amountString":100}},{"id":15,"cost":{"amountString":200}}]}]};
    
    const output = apiJson.data.map(d=>({
      jobNumber : d.jobNumber,
      tasksCost : d.jobTasks.reduce((a,b)=>a.cost.amountString+b.cost.amountString)
    }));
    
    console.log(output);

    【讨论】:

      【解决方案2】:

      您可以使用接受callback 方法的reduce 方法。

      另外,使用forEach 方法来迭代data 项目。

      var json={
       "data": [
        {
           "id": 100,
           "jobNumber": 1,
           "jobTasks": [
                 {
                 "id": 12,
                 "cost": {
                    "amountString": 100
                  }
                 },
                 {
                 "id": 13,
                 "cost": {
                    "amountString": 500
                  }
                 }
            ]
        },
        {
           "id": 101,
           "jobNumber": 2,
           "jobTasks": [
                {
                 "id": 14,
                 "cost": {
                    "amountString": 100
                 }
                 },
                {
                 "id": 15,
                 "cost": {
                    "amountString": 200
                 }
                }
          ]
      
      }]
      }
      json.data.forEach(function(item){
        var sum=item.jobTasks.reduce(function(sum,elem){
           return sum+elem.cost.amountString;
        },0);
         console.log('jobNumber'+item.jobNumber+' '+sum);
      });

      【讨论】:

        【解决方案3】:

        首先更新您的 json,数组数据的第二个对象的 jobTasks 中缺少“}”:

           "jobTasks": [    { "id": 14,
                            "cost": {
                                 "amountString": 100 
                                   }
                             },
                             {
                              "id": 15,
                          "cost": {
                                "amountString": 200
                                  }
                               }
                        ]
        

        现在获取输出:

        i = 0,1

        item.jobTasks[i]cost.amountString;

        【讨论】:

          【解决方案4】:

          这是使用object-scan 的解决方案。我们现在将它用于大部分数据处理。虽然它用途广泛,但确实需要一点时间来绕开你的脑袋。

          // const objectScan = require('object-scan');
          
          const getCounts = (data) => objectScan(['data[*].jobTasks[*].cost.amountString'], {
            filterFn: ({ parents, value, context }) => {
              const jobNumber = parents[3].jobNumber;
              context[jobNumber] = (context[jobNumber] || 0) + value;
            }
          })(data, {});
          
          const apiJson = { data: [{ id: 100, jobNumber: 1, jobTasks: [{ id: 12, cost: { amountString: 100 } }, { id: 13, cost: { amountString: 500 } }] }, { id: 101, jobNumber: 2, jobTasks: [{ id: 14, cost: { amountString: 100 } }, { id: 15, cost: { amountString: 200 } }] }] };
          
          console.log(getCounts(apiJson));
          // => { '1': 600, '2': 300 }
          .as-console-wrapper {max-height: 100% !important; top: 0}
          <script src="https://bundle.run/object-scan@13.8.0"></script>

          免责声明:我是object-scan的作者

          【讨论】:

            猜你喜欢
            • 2021-06-18
            • 1970-01-01
            • 1970-01-01
            • 2017-02-14
            • 2018-09-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多