Estoy buscando una forma eficiente de reorganizar una matriz de objetos en JS. Necesito combinar dos parámetros de cada objeto en un solo objeto, donde el valor de gwdetailsid es el mismo.
matriz inicial:
{ "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" } ] }La matriz de salida deseada:
{ "gateways": [ { "gwdetailsid": "gw1", "username": "transalis", "password": "secure_password@1" }, { "gwdetailsid": "gw2", "username": "tesco", "password": "lemon_farmer_2" } ] }Efectivamente, su tarea se reduce a transformar la matriz de data en una matriz de gateways de enlace.
Puede emplear Array.prototype.reduce() para ese tipo de trabajo, para construir el Map con la propiedad gwdetailsid como clave, luego extraiga .values() de ese 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%;}