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

时间:2020-12-31 00:06:32

标签: javascript

我正在尝试找到一种方法将以下对象数组转换为 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 个答案:

答案 0 :(得分:1)

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;
  }, {})
);

如果我正确理解您的输出示例,您希望将顶级键设为用户 ID,并将内容设为照片名称到日期时间的键值对。

所以你只需要把userid放在输出对象中作为key,一个子对象作为值,然后把photonames和datetime放在子对象中。

答案 1 :(得分:0)

您可以将 reduce 与对象一起使用来存储每个 ID 的值。

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);