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