微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

遍历对象列表并转换为具有嵌套对象列表的对象

如何解决遍历对象列表并转换为具有嵌套对象列表的对象

假设我有一个生成对象列表的 API:

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 举报,一经查实,本站将立刻删除。