JavaScript通过对象的总和

时间:2017-07-27 05:04:39

标签: javascript json object mapreduce

我正在从API返回JSON数据。然后我使用map创建自己的对象。

数据有多个对象。这是一个例子:

{
  "data": {
    "job": [
      {
        "jobNumber": "1",
        "jobTasks": {
          "jobTask": [
            {
              "total": { "amountString": "10.00" }
            },
            {
              "total": { "amountString": "10.00" }
            }
          ]
        }
      },
      {
        "jobNumber": "2",
        "jobTasks": {
          "jobTask": [
            {
              "total": { "amountString": "20.00" }
            },
            {
              "total": { "amountString": "20.00" }
            }
          ]
        }
      },
      {
        "jobNumber": "3",
        "jobTasks": {
          "jobTask": [
            {
              "total": { "amountString": "30.00" }
            },
            {
              "total": { "amountString": "30.00" }
            }
          ]
        }
      }
    ]
  }
}

从返回的示例开始,我希望得到以下内容:

jobNumber:1:总计20。 jobNumber:2:总计40。 jobNumber:3:总计60。

以下是我正在使用的代码:

var array = response.data.map(function(item, array) {

   var sumTaskTotal = item.jobTasks.reduce(function(sumTaskTotal, item, index) {
       if (item !== null && item.total !== null) {
          sumTaskTotal += item.total.amountString;
          return sumTaskTotal;
       }
    }, 0);

    array = response.data.map(item => ({
      jobNumber: item.jobNumber,
      sumTaskTotal: sumTaskTotal,
    }));
}

然而,我使用的总和只是总结,所以我最终得到:

jobNumber:1:总计120. jobNumber:120:总计120. jobNumber:3:总计120。

我试过循环,但这似乎没有让我到处。

2 个答案:

答案 0 :(得分:1)

实际上并不确定你是如何得到jobNumber: 1: Total 120. jobNumber: 120: Total 120. jobNumber: 3: Total 120.的。我尝试了你的代码,当你记录数组时,你只得到一个array with 3 undefined items;代码中map中的每次迭代都不会返回任何数组包含3个未定义项的原因。

此外,datajobTasks是对象。您应该在mapreduce属性上使用jobjobTask

至于添加总计,amountStringstring(显然),您应该先将其转换为数字。否则,第一次迭代的结果将是010.00,因为您要将string连接到number。它没有添加010.00

外部地图中的array = response.data.map...部分将再次完成所有作业。 map中的每次迭代都需要返回一个项目。如果您没有返回任何内容,undefined将是该数组的值。因此,不是再次映射数组,而是可以这样做:

return {
  jobNumber: item.jobNumber,
  sumTaskTotal,
};

然后会产生一个包含3个对象的数组:

[{
  jobNumber: '1',
  sumTaskTotal: 20,
}, {
  jobNumber: '2',
  sumTaskTotal: 40,
}, {
  jobNumber: '3',
  sumTaskTotal: 60,
}]

但是,您可以改为nested reduce

const formatted = response.data.job.reduce((prevString, currentJob) => {
  const total = currentJob.jobTasks.jobTask.reduce((prevTotal, currentJobTask) => {
    return prevTotal + Number(currentJobTask.total.amountString);
  }, 0);

  return `${prevString}jobNumber: ${currentJob.jobNumber}: Total ${total}. `;
}, '');

const response = {
  "data": {
    "job": [{
      "jobNumber": "1",
      "jobTasks": {
        "jobTask": [{
          "total": {
            "amountString": "10.00"
          }
        }, {
          "total": {
            "amountString": "10.00"
          }
        }]
      }
    }, {
      "jobNumber": "2",
      "jobTasks": {
        "jobTask": [{
          "total": {
            "amountString": "20.00"
          }
        }, {
          "total": {
            "amountString": "20.00"
          }
        }]
      }
    }, {
      "jobNumber": "3",
      "jobTasks": {
        "jobTask": [{
          "total": {
            "amountString": "30.00"
          }
        }, {
          "total": {
            "amountString": "30.00"
          }
        }]
      }
    }]
  }
};

const formatted = response.data.job.reduce((prevString, currentJob) => {
	const total = currentJob.jobTasks.jobTask.reduce((prevTotal, currentJobTask) => {
  	return prevTotal + Number(currentJobTask.total.amountString);
  }, 0);
  
  return `${prevString}jobNumber: ${currentJob.jobNumber}: Total ${total}. `;
}, '');

console.log(formatted.trim());

答案 1 :(得分:0)

您只需使用forEach即可获得所需的字符串。

const data = {
  "data": {
    "job": [
      --
    ]
  }
}

let string = "";

data.data.job.forEach((item) => {
  const sum = item.jobTasks.jobTask.reduce((total, i) => parseFloat(i.total.amountString) + total, 0);
  string += `jobNumber: ${item.jobNumber}: Total ${sum}. `;  
});
console.log(string);

jsbin

你的字符串后面会有一个不必要的空格。必要时使用修剪功能。