如何将每日数据对象变成每月对象

how to turn a daily data object into a monthly object

所以我有一个问题如何转动这个对象:

let data = [
{"branch": "london", "date": "2020-05-07", "sales": 500},
{"branch": "london", "date": "2020-05-08", "sales": 1500},
{"branch": "london", "date": "2020-05-09", "sales": 1000},
{"branch": "london", "date": "2020-06-09", "sales": 1000},
{"branch": "wales", "date": "2020-05-10", "sales": 2000},
{"branch": "wales", "date": "2020-05-11", "sales": 3000},
{"branch": "wales", "date": "2020-06-12", "sales": 2500},
{"branch": "wales", "date": "2020-08-12", "sales": 1500}
]

进入那个对象:

let monthlyData = [
{"branch": "london", "date": "2020-05", "sales": 3000},
{"branch": "london", "date": "2020-06", "sales": 1000},
{"branch": "wales", "date": "2020-05", "sales": 5000},
{"branch": "wales", "date": "2020-06", "sales": 2500},
{"branch": "wales", "date": "2020-08", "sales": 1500},
]

所以我的目标是让每个分行给我一个月度记录而不是每天 如何解决这个问题,因为我只是设法解决了这个问题,但是日期和销售额扩展了当前对象,而不是用新的月份数据创建一个新对象。

你可以用 Array.prototype.reduce():

const data = [
  {"branch": "london", "date": "2020-05-07", "sales": 500},
  {"branch": "london", "date": "2020-05-08", "sales": 1500},
  {"branch": "london", "date": "2020-05-09", "sales": 1000},
  {"branch": "london", "date": "2020-06-09", "sales": 1000},
  {"branch": "wales", "date": "2020-05-10", "sales": 2000},
  {"branch": "wales", "date": "2020-05-11", "sales": 3000},
  {"branch": "wales", "date": "2020-06-12", "sales": 2500},
  {"branch": "wales", "date": "2020-08-12", "sales": 1500}
];

const monthlyData=Object.values(data.reduce((a,c)=>{ 
 const bd=c.branch+c.date.substr(0,7);             // generate a unique key for branch and month
 if (!a[bd]) a[bd]={...c,date:c.date.substr(0,7)}; // create an entry for bd
 else a[bd].sales+=c.sales;                        // add sales to existing bd entry
 return a;                                         // Object.values: create an array by
},{}));                                            // extracting all values from the object

console.log(monthlyData)

更新:

起初我没有发现 branch 属性。此问题现已修复。

我通过对每个循环使用 2 个解决了这个问题

let data = [
    {"branch": "london", "date": "2020-05-07", "sales": 500},
    {"branch": "london", "date": "2020-05-08", "sales": 1500},
    {"branch": "london", "date": "2020-05-09", "sales": 1000},
    {"branch": "london", "date": "2020-06-09", "sales": 1000},
    {"branch": "wales", "date": "2020-05-10", "sales": 2000},
    {"branch": "wales", "date": "2020-05-11", "sales": 3000},
    {"branch": "wales", "date": "2020-05-12", "sales": 2100},
    {"branch": "wales", "date": "2020-06-12", "sales": 2500},
    {"branch": "wales", "date": "2020-08-12", "sales": 1500},
    {"branch": "wales", "date": "2020-09-12", "sales": 200},
]
monthlyData = []

data.forEach((dataSet) => {
    if (monthlyData.length === 0) {
        newObj = {
            "branch": dataSet.branch,
            "date": dataSet.date.substring(0,7),
            "sales": dataSet.sales
        }
        monthlyData.push(newObj)
    } else {
        let found = false
        monthlyData.forEach((month) => {
            if (month.branch === dataSet.branch && month.date === dataSet.date.substring(0,7)) {
                month.sales += dataSet.sales
                found = true
            }
        })
        if (!found) {
            newObj = {
                "branch": dataSet.branch,
                "date": dataSet.date.substring(0,7),
                "sales": dataSet.sales
            }
            monthlyData.push(newObj)
        }
    }
})