Javascript 如何按日期属性绑定数组中的对象
我有一个大的数据阵列。以下是该结构的一个示例:Javascript 如何按日期属性绑定数组中的对象,javascript,arrays,Javascript,Arrays,我有一个大的数据阵列。以下是该结构的一个示例: let data = [ { date: '2018-11-22', values: { a: 10, b: 20, c: 5, }, }, { date: '2018-11-17', values: { a: 5, b: 10, c: 15, }, }, { date: '2018-06-29',
let data = [
{
date: '2018-11-22',
values: {
a: 10,
b: 20,
c: 5,
},
},
{
date: '2018-11-17',
values: {
a: 5,
b: 10,
c: 15,
},
},
{
date: '2018-06-29',
values: {
a: 10,
b: 30,
c: 10,
},
},
{
date: '2017-12-20',
values: {
a: 30,
b: 40,
c: 5,
},
},
];
我需要将这些数据按月份和年份组织在一个新的数组中。应汇总每个月的值属性
因此,示例中的新阵列应如下所示:
let sortedData = [
{
date: '2018-11',
values: {
a: 15,
b: 30,
c: 20,
},
},
{
date: '2018-06',
values: {
a: 10,
b: 30,
c: 10,
},
},
{
date: '2017-12',
values: {
a: 30,
b: 40,
c: 5,
},
},
];
我花了几个小时试图编写一个工作函数,但我无法处理它。
有什么办法可以像这样捆绑一个数组吗
谢谢你的帮助 您可以使用
数组。为此减少
let data=[{date:'2018-11-22',值:{a:10,b:20,c:5,},},{date:'2018-11-17',值:{a:5,b:10,c:15,},},{date:'2018-06-29',值:{a:10,b:30,c:10,},},{date 2017-12-20',值:{a:30,b:40,c:5,}, },];
让res=data.reduce((o,{date,values})=>{
设k=date.slice(0,7)
o[k]=o[k]|{date:k,值:{a:0,b:0,c:0}
o[k].values.a+=values.a
o[k].values.b+=values.b
o[k].values.c+=values.c
返回o
}, {})
console.log(Object.values(res))
您可以为此使用数组。reduce
let data=[{date:'2018-11-22',值:{a:10,b:20,c:5,},},{date:'2018-11-17',值:{a:5,b:10,c:15,},},{date:'2018-06-29',值:{a:10,b:30,c:10,},},{date 2017-12-20',值:{a:30,b:40,c:5,}, },];
让res=data.reduce((o,{date,values})=>{
设k=date.slice(0,7)
o[k]=o[k]|{date:k,值:{a:0,b:0,c:0}
o[k].values.a+=values.a
o[k].values.b+=values.b
o[k].values.c+=values.c
返回o
}, {})
console.log(Object.values(res))
您还可以让它更简洁,而不是像这样处理单个值
道具:
let sortedData = [
{
date: '2018-11',
values: {
a: 15,
b: 30,
c: 20,
},
},
{
date: '2018-06',
values: {
a: 10,
b: 30,
c: 10,
},
},
{
date: '2017-12',
values: {
a: 30,
b: 40,
c: 5,
},
},
];
let data=[{date:'2018-11-22',值:{a:10,b:20,c:5,},},{date:'2018-11-17',值:{a:5,b:10,c:15,},},{date:'2018-06-29',值:{a:10,b:30,c:10,},},{date 2017-12-20',值:{a:30,b:40,c:5,},},];
const result=data.reduce((r,{date,values})=>{
日期=日期。子字符串(0,7)
r[日期]=r[日期]
?(Object.keys(values).forEach(k=>r[date]。values[k]+=values[k]),r[date])
:{日期,值}
返回r
}, {})
console.log(Object.values(result))
您还可以让它更简洁,而不是像这样处理单个值
道具:
let sortedData = [
{
date: '2018-11',
values: {
a: 15,
b: 30,
c: 20,
},
},
{
date: '2018-06',
values: {
a: 10,
b: 30,
c: 10,
},
},
{
date: '2017-12',
values: {
a: 30,
b: 40,
c: 5,
},
},
];
let data=[{date:'2018-11-22',值:{a:10,b:20,c:5,},},{date:'2018-11-17',值:{a:5,b:10,c:15,},},{date:'2018-06-29',值:{a:10,b:30,c:10,},},{date 2017-12-20',值:{a:30,b:40,c:5,},},];
const result=data.reduce((r,{date,values})=>{
日期=日期。子字符串(0,7)
r[日期]=r[日期]
?(Object.keys(values).forEach(k=>r[date]。values[k]+=values[k]),r[date])
:{日期,值}
返回r
}, {})
console.log(Object.values(result))
是否有办法将月份绑定到数组中而不是对象中?@iamrobin。是的,可能。您能告诉我预期的输出吗?有没有办法将月份绑定到数组中而不是对象中?@iamrobin。是的,可能。你能告诉我预期产量吗?