Группируйте элементы по общему свойству в массиве объектов

#javascript #arrays #json #object

Вопрос:

Я ищу эффективный способ переупорядочить массив объектов в 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"
    }
  ]
}
 

Комментарии:

1. Что вы пробовали до сих пор? Как вы оцениваете свое решение?

2. efficient way to rearrange an array of objects in JS . Пожалуйста, опубликуйте код, который вы пытались ввести, чтобы мы сделали это эффективным.

Ответ №1:

По сути, ваша задача сводится к преобразованию data массива в gateways массив.

Вы можете наняться Array.prototype.reduce() на такую работу, чтобы создать свойство Map with gwdetailsid в качестве ключа, а затем извлечь .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%;}