英文:
How to group array based on same value
问题
我正在使用golang,这是使用结构创建的json数据。但是我们需要根据rooms->code的值对数据进行分组。
在下面的json数据中,需要按照房间代码进行数组分组,而不是创建重复的json节点。
实际的Json数据
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": null
}
}
]
}
]
}
],
"remark": ""
}
需要转换的实际输出
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": null
}
},
{
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": null
}
}
]
}
]
}
],
"remark": ""
}
需要根据**"code": "8525"**对数据进行分组。
英文:
I am using golang this is json data those are created using struct. But we need to group data using rooms->code basis value.
In this below json data need to group array using Room Code wise. Not to create Duplicate json node.
Actual Json Data
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": null
}
}
]
}
]
}
],
"remark": ""
}
Need to convert my actual output
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": null
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": null
}
}, {
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": null
}
}
]
}
]
}
],
"remark": ""
}
Need to group data on "code": "8525"
答案1
得分: 1
你可以遍历rooms
,并将每个唯一的room.code
存储在一个map
中。当你遇到之前见过的code
时,只需将其添加到rates
数组中,该数组将成为map
中该键的值。然后,只需按顺序插入新的数字到现有的数据结构中。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type Response struct {
Status string `json:"responseStatus"`
Version string `json:"version"`
CheckIn string `json:"checkIn"`
CheckOut string `json:"checkOut"`
Currency string `json:"currency"`
Hotels []Hotel `json:"hotels"`
Remark string `json:"remark"`
}
type Hotel struct {
Code string `json:"code"`
Name string `json:"name"`
Rooms []Room `json:"rooms"`
}
type Room struct {
Code string `json:"code"`
Name string `json:"name"`
Rates []Rate `json:"rates"`
}
type Rate struct {
SupplierID string `json:"subSupplierId"`
BoardCode string `json:"boardCode"`
RateCode string `json:"ratePlanCode"`
Channel int `json:"channel"`
Allotment int `json:"allotment"`
Price float64 `json:"price"`
CancelPolicy Policy `json:"cancellationPolicy"`
}
type Policy struct {
Policies string `json:"policies"`
}
func main() {
byt, err := ioutil.ReadFile("foo.json")
if err != nil {
os.Exit(1)
}
resp := Response{}
json.Unmarshal(byt, &resp)
hotels := resp.Hotels
newHotels := make([]Hotel, 0)
for _, hotel := range hotels {
newRooms := make(map[string]Room)
for _, room := range hotel.Rooms {
if val, ok := newRooms[room.Code]; ok {
newRates := append(val.Rates, room.Rates...)
val.Rates = newRates
newRooms[room.Code] = val
} else {
newRooms[room.Code] = room
}
}
finalRooms := make([]Room, 0)
for _, v := range newRooms {
finalRooms = append(finalRooms, v)
}
hotel.Rooms = finalRooms
newHotels = append(newHotels, hotel)
}
resp.Hotels = newHotels
respJSON, err := json.MarshalIndent(resp, "", " ")
if err != nil {
os.Exit(1)
}
fmt.Printf(string(respJSON))
}
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": ""
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": ""
}
},
{
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": ""
}
}
]
}
]
}
],
"remark": ""
}
英文:
You can iterate over the rooms
and store each unique room.code
in a map
. When you encounter a code
you have seen before, just add it to the array of rates
which will be your value for that key in the map
. Then just work your way up plugging in the new numbers in to your existing data structure.
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type Response struct {
Status string `json:"responseStatus"`
Version string `json:"version"`
CheckIn string `json:"checkIn"`
CheckOut string `json:"checkOut"`
Currency string `json:"currency"`
Hotels []Hotel `json:"hotels"`
Remark string `json:"remark"`
}
type Hotel struct {
Code string `json:"code"`
Name string `json:"name"`
Rooms []Room `json:"rooms"`
}
type Room struct {
Code string `json:"code"`
Name string `json:"name"`
Rates []Rate `json:"rates"`
}
type Rate struct {
SupplierID string `json:"subSupplierId"`
BoardCode string `json:"boardCode"`
RateCode string `json:"ratePlanCode"`
Channel int `json:"channel"`
Allotment int `json:"allotment"`
Price float64 `json:"price"`
CancelPolicy Policy `json:"cancellationPolicy"`
}
type Policy struct {
Policies string `json:"policies"`
}
func main() {
byt, err := ioutil.ReadFile("foo.json")
if err != nil {
os.Exit(1)
}
resp := Response{}
json.Unmarshal(byt, &resp)
hotels := resp.Hotels
newHotels := make([]Hotel, 0)
for _, hotel := range hotels {
newRooms := make(map[string]Room)
for _, room := range hotel.Rooms {
if val, ok := newRooms[room.Code]; ok {
newRates := append(val.Rates, room.Rates...)
val.Rates = newRates
newRooms[room.Code] = val
} else {
newRooms[room.Code] = room
}
}
finalRooms := make([]Room, 0)
for _, v := range newRooms {
finalRooms = append(finalRooms, v)
}
hotel.Rooms = finalRooms
newHotels = append(newHotels, hotel)
}
resp.Hotels = newHotels
respJSON, err := json.MarshalIndent(resp, "", " ")
if err != nil {
os.Exit(1)
}
fmt.Printf(string(respJSON))
}
{
"responseStatus": "SUCCESS",
"version": "v1.9",
"checkIn": "2021-10-12",
"checkOut": "2021-10-16",
"currency": "AED",
"hotels": [
{
"code": "OT000000001",
"name": "TAJ TEST HOTEL",
"rooms": [
{
"code": "9011",
"name": "Beach Villa With Jacuzzi",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "9011_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 1469.04,
"cancellationPolicy": {
"policies": ""
}
}
]
},
{
"code": "8525",
"name": "Doubello",
"rates": [
{
"subSupplierId": "DC",
"boardCode": "FB",
"ratePlanCode": "8525_0_11_136_136",
"channel": 23,
"allotment": 100,
"price": 4407.08,
"cancellationPolicy": {
"policies": ""
}
},
{
"subSupplierId": "DC",
"boardCode": "",
"ratePlanCode": "8525_0_22_136_136",
"channel": 23,
"allotment": 100,
"price": 7345.12,
"cancellationPolicy": {
"policies": ""
}
}
]
}
]
}
],
"remark": ""
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论