为了账号安全,请及时绑定邮箱和手机立即绑定

我正在努力使用 Javascript 对象操作来输出所需的结果

我正在努力使用 Javascript 对象操作来输出所需的结果

拉莫斯之舞 2021-08-20 18:05:53
我有一组对象,我想将它们分组为特定的键和格式。这是我拥有的对象:      {         "id": "98765",         "things": [{                 "clientId": "123456",                 "val": "file1",                 "cmpId": "54353"             },             {                 "clientId": "1234",                 "val": "file2",                 "cmpId": "3453"             },             {                 "clientId": "1234",                 "val": "file3",                 "cmpId": "5433"             }         ]     };我的目标是尝试将对象转换为以下格式{  "id":"98765","things":{     "123456":{        "54353":{           "val":"file1"      }   },   "1234":{        "3453":{           "val":"file2"      },      "5433":{           "val":"file3"      }   }}}我已经设法使“clientId”成为对象的键,但我正在努力使活动 ID 嵌套在该对象中。这是我试过的代码     const a = obj.things.reduce((ac, {clientId, ...rest})=> (ac[clientId] = rest, ac), {})     console.log(a);这给出了以下格式,显然没有实现 cmpId 嵌套,但也摆脱了我的一个对象,因为 clientId 是重复的。我对如何在没有大量代码来实现它的情况下实现非常简洁的东西感到有点迷茫。{'1234': { val: 'file3', cmpId: '5433' },'123456': { val: 'file1', cmpId: '54353' }}
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

你很接近。使用Array#reduce是正确的方法。您只需要更改ac[clientId] = rest为您想要的结构:


const obj = {

         "id": "98765",

         "things": [{

                 "clientId": "123456",

                 "val": "file1",

                 "cmpId": "54353"

             },

             {

                 "clientId": "1234",

                 "val": "file2",

                 "cmpId": "3453"

             },

             {

                 "clientId": "1234",

                 "val": "file3",

                 "cmpId": "5433"

             }

         ]

     };

     

obj.things = obj.things.reduce( ( res, { clientId, cmpId, ...rest } ) => {

  res[clientId] = { ...res[clientId], [cmpId]: rest };

  return res;

}, { } );


console.log( obj );


查看完整回答
反对 回复 2021-08-20
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

你快到了,你还需要获取cmpId然后检查是否已经有一个对象clientId,这里是一个例子:


const input = {

  "id": "98765",

  "things": [{

      "clientId": "123456",

      "val": "file1",

      "cmpId": "54353"

    },

    {

      "clientId": "1234",

      "val": "file2",

      "cmpId": "3453"

    },

    {

      "clientId": "1234",

      "val": "file3",

      "cmpId": "5433"

    }

  ]

};


input.things = input.things.reduce((a, {

  clientId,

  cmpId,

  ...rest

}) => {

  if (a[clientId]) {

    a[clientId][cmpId] = rest;

  } else {

    a[clientId] = {

      [cmpId]: rest

    };

  }

  return a;

}, {});


console.log(input);


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信