Javascript 使用groupby重塑对象的形状
我有以下对象数组:Javascript 使用groupby重塑对象的形状,javascript,lodash,Javascript,Lodash,我有以下对象数组: const data=[ { "datetime": "2020-01-30T00:59:59.000Z", "Benzene": 3.6 }, { "datetime": "2020-01-30T00:59:59.000Z",
const data=[
{
"datetime": "2020-01-30T00:59:59.000Z",
"Benzene": 3.6
},
{
"datetime": "2020-01-30T00:59:59.000Z",
"O3": 3.7
},
{
"datetime": "2020-01-30T00:59:59.000Z",
"PM10": 3.1
},
{
"datetime": "2020-03-30T00:59:59.000Z",
"Benzene": 2.6
},
{
"datetime": "2020-03-30T00:59:59.000Z",
"O3": 5.7
},
{
"datetime": "2020-03-30T00:59:59.000Z",
"PM10": 10.5
}
]
我只想通过按日期分组来重塑它,如下所示:
[{ "date":"2020-01-30",
"values":[{"t":"2020-01-30T00:59:59.000Z",
"Benzene":3.6,
"O3":3.7,
"PM10":3.1}]},
{ "date":"2020-03-30",
"values":[{"t":"2020-03-30T00:59:59.000Z",
"Benzene":2.6,
"O3":5.7,
"PM10":10.5}]}]
我想我可以使用Loadash和.map来实现这一点,但我不知道如何实现
有什么建议吗?你可以用
常数数据=[
{
日期时间:“2020-01-30T00:59:59.000Z”,
苯:3.6,
},
{
日期时间:“2020-01-30T00:59:59.000Z”,
O3:3.7,
},
{
日期时间:“2020-01-30T00:59:59.000Z”,
PM10:3.1,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
苯:2.6,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
O3:5.7,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
PM10:10.5,
},
];
const result=data.reduceac,val=>{
const tryFind=acc.findel=>el.date==val.datetime;
常数{datetime,…valExcludeDate}=val;
如果尝试查找{
tryFind.values[0]={…tryFind.values[0],…valExcludeDate};
}否则{
acc.push{date:datetime,值:[{…valExcludeDate}]};
}
返回acc;
}, [];
console.logresult 您可以使用
常数数据=[
{
日期时间:“2020-01-30T00:59:59.000Z”,
苯:3.6,
},
{
日期时间:“2020-01-30T00:59:59.000Z”,
O3:3.7,
},
{
日期时间:“2020-01-30T00:59:59.000Z”,
PM10:3.1,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
苯:2.6,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
O3:5.7,
},
{
日期时间:“2020-03-30T00:59:59.000Z”,
PM10:10.5,
},
];
const result=data.reduceac,val=>{
const tryFind=acc.findel=>el.date==val.datetime;
常数{datetime,…valExcludeDate}=val;
如果尝试查找{
tryFind.values[0]={…tryFind.values[0],…valExcludeDate};
}否则{
acc.push{date:datetime,值:[{…valExcludeDate}]};
}
返回acc;
}, [];
console.logresult 您可以先从lodash应用到按日期时间分组的元素,然后应用到每个分组元素的映射值和组合值。
一种可能的方法如下
常数数据=[{
日期时间:2020-01-30T00:59:59.000Z,
苯:3.6
},
{
日期时间:2020-01-30T00:59:59.000Z,
O3:3.7
},
{
日期时间:2020-01-30T00:59:59.000Z,
PM10:3.1
},
{
日期时间:2020-03-30T00:59:59.000Z,
苯:2.6
},
{
日期时间:2020-03-30T00:59:59.000Z,
O3:5.7
},
{
日期时间:2020-03-30T00:59:59.000Z,
PM10:10.5
}
];
const groups=u.groupBydata,i=>i['datetime'].substring0,10;
常量res=Object.entriesgroups.reduceac,g=>{
常数[键,值]=g;
加速推{
日期:,
值:[对象.赋值{},…值]
};
返回acc;
}, [];
console.logres;
您可以先从lodash应用到按日期时间分组的元素,然后应用到每个分组元素的映射值和组合值。
一种可能的方法如下
常数数据=[{
日期时间:2020-01-30T00:59:59.000Z,
苯:3.6
},
{
日期时间:2020-01-30T00:59:59.000Z,
O3:3.7
},
{
日期时间:2020-01-30T00:59:59.000Z,
PM10:3.1
},
{
日期时间:2020-03-30T00:59:59.000Z,
苯:2.6
},
{
日期时间:2020-03-30T00:59:59.000Z,
O3:5.7
},
{
日期时间:2020-03-30T00:59:59.000Z,
PM10:10.5
}
];
const groups=u.groupBydata,i=>i['datetime'].substring0,10;
常量res=Object.entriesgroups.reduceac,g=>{
常数[键,值]=g;
加速推{
日期:,
值:[对象.赋值{},…值]
};
返回acc;
}, [];
console.logres;
要获得准确的所需输出,请尝试:
const result = data.reduce((acc, val) => {
const find = acc.find(el => el.date === val.datetime.substring(0, 10));
const { datetime, ...obj } = val;
if (find) {
find.values[0] = { ...find.values[0], ...obj };
} else {
acc.push({ date: datetime.substring(0, 10), values: [{ t: datetime, ...obj }] });
}
return acc;
}, []);
要获得准确的所需输出,请尝试:
const result = data.reduce((acc, val) => {
const find = acc.find(el => el.date === val.datetime.substring(0, 10));
const { datetime, ...obj } = val;
if (find) {
find.values[0] = { ...find.values[0], ...obj };
} else {
acc.push({ date: datetime.substring(0, 10), values: [{ t: datetime, ...obj }] });
}
return acc;
}, []);
这可以在javascript中完成,无需lodash,就像其他答案一样,下面是我使用reduce的尝试:
var数据=[{datetime:2020-01-30T00:59:59.000Z,苯:3.6},{datetime:2020-01-30T00:59:59.000Z,O3:3.7},{datetime:2020-01-30T00:59.000Z,PM10:3.1},{datetime:2020-03-30T00:59.000Z,苯:2.6},{datetime:2020-03-30T00:59:59.000Z,O3:5.7},{datetime:2020-03-30T00:59.0005};
var result=Object.valuesdata.reduceacc,{datetime,…rest}=>{
const date=datetime.0,10
acc[date]=acc[date]|{date,值:[]};
acc[date]。值=[{…acc[date]。值[0],…{t:datetime,…rest}];
返回acc;
},{};
console.logresult 这可以在javascript中完成,无需lodash,就像其他答案一样,下面是我使用reduce的尝试:
var数据=[{datetime:2020-01-30T00:59:59.000Z,苯:3.6},{datetime:2020-01-30T00:59:59.000Z,O3:3.7},{datetime:2020-01-30T00:59.000Z,PM10:3.1},{datetime:2020-03-30T00:59.000Z,苯:2.6},{datetime:2020-03-30T00:59:59.000Z,O3:5.7},{datetime:2020-03-30T00:59.0005};
var result=Object.valuesdata.reduceacc,{datetime,…rest}=>{
常数日期=d
atetime.0,10
acc[date]=acc[date]|{date,值:[]};
acc[date]。值=[{…acc[date]。值[0],…{t:datetime,…rest}];
返回acc;
},{};
console.logresult;谢谢!它很好用。你能给我推荐一些关于JSON/数据操作的有用文章/教程吗?@EanX很高兴知道它适合你。我可以和你分享我的学习资料,希望这些能对你有所帮助。2.3.4.谢谢@ParthoShuvo,它对提供的数据很有效,但对我的真实案例无效。请检查我的电话号码。我不明白为什么它只适用于一个项目,也就是说,我想在values键内收集特定日期所有小时的所有读取,但我只获得一个项目的一小时。预期输出应该是:[{date:2020-06-30,values:[{t:2020-06-30T00:59:59.000Z,苯:5.5,NO2:11.7,O3:35.1},{t:2020-06-30T01:59:59.000Z,苯:5.2,NO2:15.7,O3:55.7}]在同一日期内有多个对象,但每小时一个对象收集所有传感器读数。相反,我只获得最后一个小时的读数。非常感谢!它工作正常。您能给我推荐一些关于JSON/数据操作的有用文章/教程吗?@EanX很高兴知道它对您有效。我可以与您分享我的学习材料,希望这些将帮助您1.2.3.4.谢谢@ParthoShuvo,它对提供的数据很好,但对我的真实情况不起作用。请检查我的。我不明白为什么它只对一个项目有效,即我想在值键内收集特定日期所有小时的所有读取,但我只得到一个小时一个项目。预期输出应为:[{日期:2020-06-30,数值:[{t:2020-06-30T00:59:59.000Z,苯:5.5,NO2:11.7,O3:35.1},{t:2020-06-30T01:59:59.000Z,苯:5.2,NO2:15.7,O3:55.7} ] } ]同一日期内有多个对象,但每小时有一个对象收集所有传感器读数。相反,我只获取最后一个小时的读数。它适用于特定日期内的一行值。感谢@gorak,它适用于提供的数据,但不适用于我的真实情况。请检查我的。我不明白为什么它适用于ly,也就是说,我想在一个值字段中收集特定日期内所有小时的所有读取数据,但我只有一个小时。在这个新的字段中,我试图更好地澄清我的问题和我能够编写的解决方案。你能建议一个更好的方法吗?ThanksIt适用于特定日期内的一行值。感谢@gorak,它对提供的数据非常有效数据,但不适用于我的真实情况。请检查我的。我不明白为什么它只适用于一个项目,即,我想在一个值字段中收集特定日期所有小时的所有读取数据,但我只有一个小时。在这个新字段中,我试图更好地澄清我的问题和我能够编码的解决方案。你能建议一个更好的方法吗?谢谢我尝试更好地澄清我的问题和我能够编写的解决方案。你能建议一个更好的方法吗?谢谢我遵循了你的方法,但它只适用于一个项目,请检查我的代码/张贴在这个新的我尝试更好地澄清我的问题和解决方案解决方案我能够编码。你能建议一个更好的方法吗?谢谢