繁体   English   中英

按对象数组中的公共属性对项目进行分组

[英]Group items by common property in array of objects

我正在寻找一种有效的方法来重新排列 JS 中的对象数组。 我需要将每个对象的两个参数组合成一个对象,其中gwdetailsid值相同。

初始数组:

{
  "data": [
    {
      "gwdetailsid": "gw1",
      "gwpname": "username",
      "gwpvalue": "transalis"
    },
    {
      "gwdetailsid": "gw1",
      "gwpname": "password",
      "gwpvalue": "secure_password@1"
    },
    {
      "gwdetailsid": "gw2",
      "gwpname": "username",
      "gwpvalue": "tesco"
    },
    {
      "gwdetailsid": "gw2",
      "gwpname": "password",
      "gwpvalue": "lemon_farmer_2"
    }
  ]
}

所需的输出数组:

{
  "gateways": [
    {
      "gwdetailsid": "gw1",
      "username": "transalis",
      "password": "secure_password@1"
    },
    {
      "gwdetailsid": "gw2",
      "username": "tesco",
      "password": "lemon_farmer_2"
    }
  ]
}

实际上,您的任务归结为将data数组转换为gateways数组。

您可以使用Array.prototype.reduce()来完成这种工作,以gwdetailsid属性作为键来构建Map ,然后提取该Map .values()

 const data = [{gwdetailsid:"gw1",gwpname:"username",gwpvalue:"transalis"},{gwdetailsid:"gw1",gwpname:"password",gwpvalue:"secure_password@1"},{gwdetailsid:"gw2",gwpname:"username",gwpvalue:"tesco"},{gwdetailsid:"gw2",gwpname:"password",gwpvalue:"lemon_farmer_2"}], gateways = [...data .reduce((acc, {gwdetailsid, gwpname, gwpvalue} ) => { const group = acc.get(gwdetailsid) group ? group[gwpname] = gwpvalue : acc.set(gwdetailsid, {gwdetailsid, [gwpname]: gwpvalue}) return acc }, new Map) .values() ] console.log(gateways)
 .as-console-wrapper{min-height:100%;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM