从一个对象数组中创建一个新的切片,并进行分组。

huangapple go评论89阅读模式
英文:

Creating a new slice from an array of objects golang and group

问题

你可以使用以下代码来生成预期的输出:

package main

import (
	"fmt"
)

type paymenthodUsers struct {
	PayMethodID int
	UserID      int
}

type paymentMethodGrouped struct {
	PayMethodID int
	Users       []user
}

type user struct {
	UserID int
}

func main() {
	input := []paymenthodUsers{
		{1, 1},
		{2, 2},
		{1, 4},
		{2, 3},
	}

	grouped := make(map[int][]user)
	for _, item := range input {
		grouped[item.PayMethodID] = append(grouped[item.PayMethodID], user{item.UserID})
	}

	output := []paymentMethodGrouped{}
	for payMethodID, users := range grouped {
		output = append(output, paymentMethodGrouped{payMethodID, users})
	}

	fmt.Println(output)
}

这段代码首先定义了输入和输出的结构体类型。然后,它使用一个循环将具有相同 pay_method_id 的用户分组到一个映射中。最后,它将映射转换为预期的输出格式。

希望这可以帮助到你!

英文:

I have an array of objects that I would like to use to create a new slice while grouping a field for objects with the same id(the id, in this case, the id is pay_method_id) into an array of objects. i.e I want to group all users with a particular payment method

sample input

[{
    "user_id": 1,
    "pay_method_id": 1
}

{
    "user_id": 2,
    "pay_method_id": 2
}

{
    "user_id": 4,
    "pay_method_id": 1
}

{
    "user_id": 3,
    "pay_method_id": 2
}]

expected output

[
    {"pay_method_id" : "2",
     "users": [{"user_id": 2}, {"user_id": 3}]
    
    }
    {
        "pay_method_id" : "1",
        "users": [{"user_id": 4}, {"user_id": 1}]
       
       }
]

Struct representing input

type paymenthodUsers struct{
   PayMethodID int
   UserID int
}

Struct for the output

type paymentMethodGrouped struct{
   PayMethodID int
   Users []user
}
type user struct{
   UserID int
}

How do I generate the expected output above in golang?

答案1

得分: 1

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

type paymenthodUsers struct {
	PayMethodID int `json:"pay_method_id"`
	UserID      int `json:"user_id"`
}

type paymentMethodGrouped struct {
	PayMethodID int    `json:"pay_method_id"`
	Users       []user `json:"users"`
}
type user struct {
	UserID int `json:"user_id"`
}

func main() {
	_json := `[{
	"user_id": 1,
	"pay_method_id": 1
	},

	{
	"user_id": 2,
	"pay_method_id": 2
	},

	{
	"user_id": 4,
	"pay_method_id": 1
	},

	{
	"user_id": 3,
	"pay_method_id": 2
	}]`
	var paymentmethods []paymenthodUsers
	err := json.Unmarshal([]byte(_json), &paymentmethods)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("原始输入: %+v\n", paymentmethods)
	groups := make(map[int][]user)
	for _, pm := range paymentmethods {
		if _, found := groups[pm.PayMethodID]; !found {
			groups[pm.PayMethodID] = []user{}
		}
		groups[pm.PayMethodID] = append(groups[pm.PayMethodID], user{pm.UserID})
	}
	paymentGroups := []paymentMethodGrouped{}
	for k, v := range groups {
		paymentGroups = append(paymentGroups, paymentMethodGrouped{k, v})
	}
	data, err := json.Marshal(paymentGroups)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("分组结果: %s", string(data))
}

Go Playground演示

英文:
package main
import (
"encoding/json"
"fmt"
"log"
)
type paymenthodUsers struct {
PayMethodID int `json:"pay_method_id"`
UserID      int `json:"user_id"`
}
type paymentMethodGrouped struct {
PayMethodID int    `json:"pay_method_id"`
Users       []user `json:"users"`
}
type user struct {
UserID int `json:"user_id"`
}
func main() {
_json := `[{
"user_id": 1,
"pay_method_id": 1
},
{
"user_id": 2,
"pay_method_id": 2
},
{
"user_id": 4,
"pay_method_id": 1
},
{
"user_id": 3,
"pay_method_id": 2
}]`
var paymentmethods []paymenthodUsers
err := json.Unmarshal([]byte(_json), &paymentmethods)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Original input : %+v\n", paymentmethods)
groups := make(map[int][]user)
for _, pm := range paymentmethods {
if _, found := groups[pm.PayMethodID]; !found {
groups[pm.PayMethodID] = []user{}
}
groups[pm.PayMethodID] = append(groups[pm.PayMethodID], user{pm.UserID})
}
paymentGroups := []paymentMethodGrouped{}
for k, v := range groups {
paymentGroups = append(paymentGroups, paymentMethodGrouped{k, v})
}
data, err := json.Marshal(paymentGroups)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Grouped: %s", string(data))
}

Go Playground Demo

huangapple
  • 本文由 发表于 2022年6月5日 18:23:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/72506551.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定