代码之家  ›  专栏  ›  技术社区  ›  Adam

JS将对象数组转换为JSON GroupBy格式

  •  0
  • Adam  · 技术社区  · 4 年前

    我试图找到一种方法将以下对象数组转换为JSON

    const arr = [
      {
        userid: '1000080542',
        photoname: '2c8a4709-ed7e-00a50-0da4ead1de55118-f3-1473281639’,
        datetime: ‘2020-01-24T20:46:05+11:00’
      },
      {
        userid: '1000081532',
        photoname: '73321038-c8bf-57c6e-5d803cd0a920e9a-95-1487447082',
        datetime: ‘2020-01-24T20:46:05+11:00’
      },
      {
        userid: '1000081532',
        photoname: '5c00bc65-db1b-7a394-dd65b462b9e75e2-c5-1487447019',
        datetime: ‘2020-01-24T20:46:05+11:00’
      },
      {
        userid: '1000081532',
        photoname: '986ee1e2-2f8e-bf070-0d70d2e67537835-e2-1473821119',
        datetime: ‘2020-01-24T20:46:05+11:00’
      },
      {
        userid: '1000081532',
        photoname: '09f7cde6-68c8-f462d-c01f7713a2c747f-eb-1474294185',
        datetime: ‘2020-01-24T20:46:05+11:00’
      }
    ]
    

    转换格式

    {
                1000080542: {
                    '2c8a4709-ed7e-00a50-0da4ead1de55118-f3-1473281639': '2020-01-24T20:46:05+11:00',
                    '73321038-c8bf-57c6e-5d803cd0a920e9a-95-1487447082': '2020-01-24T20:46:05+11:00'
                },
                1000081532: {
                    '5c00bc65-db1b-7a394-dd65b462b9e75e2-c5-1487447019'': '2020-01-24T20:46:05+11:00',
                    '986ee1e2-2f8e-bf070-0d70d2e67537835-e2-1473821119': '2020-01-24T20:46:05+11:00',
                    '09f7cde6-68c8-f462d-c01f7713a2c747f-eb-1474294185': '2020-01-24T20:46:05+11:00'
                }
            }
    

    obj = arr.reduce((h, y) => {
      Object.keys(y).forEach(k => {
        if (!h[k]) {
          h[k] = []
          h[k].push(y[k])
        } else if (!h[k].includes(y[k])) h[k].push(y[k])
      })
      return h
    }, {})
    console.log(obj)
    

    谢谢

    2 回复  |  直到 4 年前
        1
  •  1
  •   Taplar    4 年前

    const arr = [
      {
        userid: '1000080542',
        photoname: '2c8a4709-ed7e-00a50-0da4ead1de55118-f3-1473281639',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '73321038-c8bf-57c6e-5d803cd0a920e9a-95-1487447082',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '5c00bc65-db1b-7a394-dd65b462b9e75e2-c5-1487447019',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '986ee1e2-2f8e-bf070-0d70d2e67537835-e2-1473821119',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '09f7cde6-68c8-f462d-c01f7713a2c747f-eb-1474294185',
        datetime: '2020-01-24T20:46:05+11:00'
      }
    ];
    
    console.log(
      arr.reduce((accumulator, element) => {
        if (!accumulator[element.userid]) accumulator[element.userid] = {};
        
        accumulator[element.userid][element.photoname] = element.datetime;
        
        return accumulator;
      }, {})
    );

    如果我正确理解了您的输出示例,那么您希望使顶级键成为userid,而内容是photonames到日期时间的键值对。

    因此,您只需将userid作为键放入输出对象中,并将子对象作为值,然后将photonames和datetime放入子对象中。

        2
  •  0
  •   Unmitigated    4 年前

    你可以用 reduce

    const arr = [
      {
        userid: '1000080542',
        photoname: '2c8a4709-ed7e-00a50-0da4ead1de55118-f3-1473281639',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '73321038-c8bf-57c6e-5d803cd0a920e9a-95-1487447082',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '5c00bc65-db1b-7a394-dd65b462b9e75e2-c5-1487447019',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '986ee1e2-2f8e-bf070-0d70d2e67537835-e2-1473821119',
        datetime: '2020-01-24T20:46:05+11:00'
      },
      {
        userid: '1000081532',
        photoname: '09f7cde6-68c8-f462d-c01f7713a2c747f-eb-1474294185',
        datetime: '2020-01-24T20:46:05+11:00'
      }
    ];
    const res = arr.reduce((acc,{userid,photoname,datetime})=>{
      (acc[userid] = acc[userid] || {})[photoname] = datetime;
      return acc;
    }, {});
    console.log(res);