如何读取值并通过动态数组求和?

时间:2019-03-06 13:32:33

标签: javascript json vue.js

我有这样的JSON

"result": [{
        "channel": "A",
        "mkp": "ABC",
        "qtd": 6,
        "total": 2938.2,
        "data": "2019-02-16",
        "time": "22:30:40"
    }, {
        "channel": "C",
        "mkp": "DEF",
        "qtd": 1545,
        "total": 2127229.64,
        "data": "2019-02-20",
        "time": "17:19:49"
    }, {
        "channel": "C",
        "mkp": "JKL",
        "qtd": 976,
        "total": 1307328.37,
        "data": "2019-02-20",
        "time": "17:19:53"
    }, {
        "channel": "U",
        "mkp": "PQR",
        "qtd": 77,
        "total": 98789.87,
        "data": "2019-02-20",
        "time": "16:12:31"
    }, {
        "channel": "U",
        "mkp": "STU",
        "qtd": 427,
        "total": 433206.62,
        "data": "2019-02-20",
        "time": "17:04:27"
    }
]

我需要对QTD求和,并在通道相同时返回最新数据+时间(例如:通道C和U有2个条目),如果不是,那么我将只显示值,但是我不知道该如何迭代和进行这些数学运算。有人可以帮忙吗?

我想要的样本:

"A": [{
  "qtd": 6,
  "total": 2938.20,
  "dateTime": 2019 - 02 - 16 22: 30: 40 "
}],
"C": [{
  "qtd": 2.521,
  "total": 3434558.01,
  "dateTime": 2019 - 02 - 20 17: 19: 53 "
}],
"U": [{
  "qtd": 504,
  "total": 531996,
  49,
  "dateTime": 2019 - 02 - 20 17: 04: 27 "
}]

目前,我使用filter来分隔值,如下所示:

this.channelA = this.receivedJson.filter(({ channel }) => channel === "A");

2 个答案:

答案 0 :(得分:0)

您可以使用reduce方法并返回一个带有对象作为值的对象。

const data = [{"channel":"A","mkp":"ABC","qtd":6,"total":2938.2,"data":"2019-02-16","time":"22:30:40"},{"channel":"C","mkp":"DEF","qtd":1545,"total":2127229.64,"data":"2019-02-20","time":"17:19:49"},{"channel":"C","mkp":"JKL","qtd":976,"total":1307328.37,"data":"2019-02-20","time":"17:19:53"},{"channel":"U","mkp":"PQR","qtd":77,"total":98789.87,"data":"2019-02-20","time":"16:12:31"},{"channel":"U","mkp":"STU","qtd":427,"total":433206.62,"data":"2019-02-20","time":"17:04:27"}]

const res = data.reduce((r, {channel, qtd, total, data, time}) => {
  const dateTime = `${data} ${time}`
  if(!r[channel]) r[channel] = {qtd, total, dateTime}
  else {
    r[channel].total += total
    r[channel].qtd += qtd;
    r[channel].dateTime = dateTime
  }
  return r;
}, {})

console.log(res)

答案 1 :(得分:0)

您使用reduce对基于channel的值进行分组,如下所示:

const input = [{"channel":"A","mkp":"ABC","qtd":6,"total":2938.2,"data":"2019-02-16","time":"22:30:40"},{"channel":"C","mkp":"DEF","qtd":1545,"total":2127229.64,"data":"2019-02-20","time":"17:19:49"},{"channel":"C","mkp":"JKL","qtd":976,"total":1307328.37,"data":"2019-02-20","time":"17:19:53"},{"channel":"U","mkp":"PQR","qtd":77,"total":98789.87,"data":"2019-02-20","time":"16:12:31"},{"channel":"U","mkp":"STU","qtd":427,"total":433206.62,"data":"2019-02-20","time":"17:04:27"}]

const merged = input.reduce((acc, { channel, qtd, total, data, time }) => {
  acc[channel] = acc[channel] || [{ qtd: 0, total: 0, dateTime:'' }];
  const group = acc[channel][0];
  group.qtd += qtd;
  group.total += total;
  
  const dateTime = `${data} ${time}`
  if(dateTime > group.dateTime)
    group.dateTime = dateTime;
    
  return acc;
}, {})

console.log(merged)