如何将每日数据对象变成每月对象
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)
}
}
})
所以我有一个问题如何转动这个对象:
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)
}
}
})