【问题标题】:Group items by common property in array of objects按对象数组中的公共属性对项目进行分组
【发布时间】:2021-10-18 13:14:24
【问题描述】:

我正在寻找一种在 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"
    }
  ]
}

【问题讨论】:

  • 到目前为止你尝试过什么?您如何对解决方案进行基准测试?
  • efficient way to rearrange an array of objects in JS。请发布您尝试过的代码,以便我们提高效率。

标签: javascript arrays json object


【解决方案1】:

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

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

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%;}

【讨论】:

    猜你喜欢
    • 2021-08-18
    • 2023-03-03
    • 1970-01-01
    • 2020-10-17
    • 2015-12-31
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多