求教,如何将对象里的属性进行分组和合并

问题描述

我有一个这样的数组:

[
  {
    test1: 86,
    test2: 75,
    test3: 89,
    time: '2019-01-13',
    name: 'lisa',
  },
  {
    test1: 8,
    test2: 6,
    test3: 99,
    time: '2020-02-12',
    name: 'jennie'
  },
  {
    test1: 11,
    test2: 22,
    test3: 100,
    time: '2020-02-11',
    name: 'jennie'
  }
]

我想把它处理成这样:

[{
          dataType: 'test1',
          list: [
            {
              time: '2019-01-13',
              score: 86,
              name: 'lisa'
            },
            {
              time: '2020-02-12',
              score: 8,
              name: 'jennie'
            },
              {
                time: '2020-02-11',
                score: 11,
                name: 'jennie'
              }
          ]
        },
          {
            dataType: 'test2',
            list: [
              {
                time: '2019-01-13',
                score: 75,
                name: 'lisa'
              },
              {
                time: '2020-02-12',
                score: 6,
                name: 'jennie'
              },
              {
                time: '2020-02-11',
                score: 22,
                name: 'jennie'
              }
            ]
          },
          {
            dataType: 'test3',
            list: [
              {
                time: '2019-01-13',
                score: 75,
                name: 'lisa'
              },
              {
                time: '2020-02-12',
                score: 6,
                name: 'jennie'
              },
              {
                time: '2020-02-11',
                score: 100,
                name: 'jennie'
              }
            ]
          }
        ]

每个对象中的name属性有可能相同,但time唯一
求大佬解救,小白处理了好久也不得不到想要的结果

阅读 1.9k
2 个回答
let arr = [
  {
    test1: 86,
    test2: 75,
    test3: 89,
    time: '2019-01-13',
    name: 'lisa',
  },
  {
    test1: 8,
    test2: 6,
    test3: 99,
    time: '2020-02-12',
    name: 'jennie'
  },
  {
    test1: 11,
    test2: 22,
    test3: 100,
    time: '2020-02-11',
    name: 'jennie'
  }
];
let tempObj = {};
Object.keys(arr[0]).forEach(key => {
    if(/^test\d/.test(key)) tempObj[key] = [];
});
arr.forEach(item => {
    Object.keys(item).forEach(key => {
        if(tempObj[key]) tempObj[key].push({
            "time": item['time'],
            "score": item[key],
            "name": item['name']
        })
    })
});
let result = Object.keys(tempObj).map(key => {
    return {
        dataType: key,
        list: tempObj[key]
    }
})
let result=arr.reduce((result,v)=>{
    let {name,time,...tests}=v;
    Object.keys(tests).forEach(test=>{
        let list=result[test]=result[test]||[];    
        list.push({time,score:tests[test],name})
    })
    return result;
},{})
Object.keys(result).map(v=>({dataType:v,list:result[v]}))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题