如何解决遍历对象列表并转换为具有嵌套对象列表的对象
const data = [
{
"get_study_name": "INFRONT-3","visit_status": "Completed","get_year": 2021,"get_month": 7
},{
"get_study_name": "EMBARK",{
"get_study_name": "INFRONT-3","get_year": 2020,"get_month": 6
}
]
是否有可能对其进行迭代或映射并产生这样的结果?
newData: {
2021: [
{
name: 'INFRONT-3','EMBARK' //string concatenation of get_study_name
data: [0,2,0],//array of months (index +1),and count occurence
fill: 'start' //inject this on each object
}
],2020: [
{
name: 'INFRONT-3'
data: [0,1,fill: 'start'
}
],}
我真的很感激任何提示。我被困了 3 天,我能做的最多的就是获得独一无二的年份。
解决方法
const newData = {}
data.forEach(d => {
if (newData[d.get_year]) {
const datum = newData[d.get_year];
datum.name += `,${d.get_study_name}`;
datum.data[d.get_month + 1]++;
} else {
newData[d.get_year] = {
name: d.get_study_name,data: [0,0],fill: 'start'
}
newData[d.get_year].data[d.get_moth+1]++;
}
});
,
您在示例中的评论
//get_study_name 的连接字符串
不清楚,它没有将字符串显示为已连接,实际上换行符/使对象无效。 也不清楚在什么条件下年数组应该包含多个对象。
const data = [
{
"get_study_name": "INFRONT-3","visit_status": "Completed","get_year": 2021,"get_month": 7
},{
"get_study_name": "EMBARK",{
"get_study_name": "INFRONT-3","get_year": 2020,"get_month": 6
}
];
const newData = {};
for (let i = 0; i < data.length; i++)
{
const d = data[i],obj = (newData[d.get_year] || [{name:'',data:Array(12).fill(0),fill:"start"}])[0];
obj.name += (obj.name && ",") + d.get_study_name; // add name
obj.data[d.get_month-1]++; // increase month count
newData[d.get_year] = [obj];
}
console.log(newData);
这是一种结合使用 reduce 和 map 的方法。
const data = [{
"get_study_name": "INFRONT-3","get_month": 7
},{
"get_study_name": "EMBARK",{
"get_study_name": "INFRONT-3","get_month": 6
}
]
let obj = Object.fromEntries(Object.entries(data.reduce((acc,a) => {
if (!acc.hasOwnProperty(a.get_year)) acc[a.get_year] = [];
let b = acc[a.get_year]
let i = b.findIndex(e => e.get_month = a.get_month)
if (i > -1) {
b[i].name.push(a.get_study_name);
b[i].data[a.get_month]++
} else {
let cal = Array(12).fill(0);
cal[a.get_month]++
b.push({ ...a,data: cal,name: [a.get_study_name]
})
}
return acc
},{})).map(d => {
d[1] = d[1].map(e => {
delete e.get_study_name;
delete e.get_month;
delete e.get_year;
delete e.visit_status;
e.fill = 'start';
e.name = e.name.join(',')
return e;
})
return d
}))
console.log(obj)
/*
newData: {
2021: [
{
name: 'INFRONT-3','EMBARK' //joined string of get_study_name
data: [0,2,//array of months (index +1),and count occurence
fill: 'start' //inject this on each object
}
],2020: [
{
name: 'INFRONT-3'
data: [0,1,fill: 'start'
}
],}
*/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。