切片查找其中一个属性具有相同值的所有结构

问题描述 投票:0回答:1

我想找到相似的条目并想将它们存储在相同的id下

options = [
      {"ABC": [opt1, opt2]}, // opt1 and opt2 have the same id
      {"DEF": [opt3]}
]

输入看起来像这样

input = [opt1, opt2, opt3, opt4] // opt1.id = opt2.id == "ABC"

基于

尝试了这个演示

type Priceoption struct {
    Option      string `json:"prnumber"`
    Price       string `json:"price"`
    Setting     string `json:"setting"`
    Origin string `json:"Origin"`
}

func GetPriceOptions() []Priceoption {

    opts := []Priceoption{
        {Option: "ABC", Price: "11.00", Setting: "foo", Origin: "201"},
        {Option: "DEF", Price: "27.00", Setting: "bar", Origin: "198"},
        {Option: "XYZ", Price: "41.00", Setting: "zap", Origin: "E"},
        {Option: "DEF", Price: "27.00", Setting: "bar", Origin: "198"},
        {Option: "ABC", Price: "n/a", Setting: "foo", Origin: "201"},
    }
    return opts
}

还有这个

func main() {

    opts := GetPriceOptions()

    sort.Slice(opts, func(i, j int) bool {
        if opts[i].Option != opts[j].Option {
            return opts[i].Option < opts[j].Option
        }
        return opts[i].Price < opts[j].Price
    })
    fmt.Printf("Sorted Options List: %v\n", opts)
    opts = slices.Compact(opts) // works if every property has the same value
    fmt.Printf("Compacted List: %v\n", opts)
}

这适用于每个属性中具有相同值的每个结构(仅上面

{DEF 27.00 bar 198}
)。但我想找到一个属性具有相同值的结构。

以这两个为例

opt1 = {"Option": "ABC", "Price": "11.00", "Setting": "foo", "Origin": "201"}
opt2 = {"Option": "ABC", "Price": "n/a", "Setting": "bar", "Origin": "E"}

我尝试调整检查结构中是否存在值并将其保存在另一个数组中来解决我的问题

但是我的演示代码被困住了

恐慌:运行时错误:无效的内存地址或 nil 指针 取消引用 [信号 SIGSEGV:分段违规代码=0x1 addr=0x20 pc=0x4577ff]

goroutine 1 [运行]: main.main() /tmp/sandbox1376546491/prog.go:50 +0x23f

失败的行是我想向地图添加选项的行

optiongroup.Options = append(optiongroup.Options, opt)

这里是

main

func main() {

    priceoptions := GetPriceOptions()
    optiongroups := make(map[string]*OptionGroup) // map

    for _, opt := range priceoptions {
        optId := opt.Option
        optiongroup, ok := optiongroups[optId]

        if !ok {
            optiongroup := &OptionGroup{OptId: optId, Options: []Priceoption{}}
            optiongroups[optId] = optiongroup
        }

        // Append option fails
        optiongroup.Options = append(optiongroup.Options, opt)
    }
    println("optiongroups", len(optiongroups))
}
  • 是否有一种简单的方法可以查找列表中一个属性具有相同值的所有结构?
  • 我在某个地图位置附加另一个选项的错误是什么:
    map["ABC"].Add(option)
go grouping
1个回答
0
投票

如果您从 !ok 条件内的选项组中删除 := ,则追加应该可以工作。

    if !ok {
        optiongroup = &OptionGroup{OptId: optId, Options: []Priceoption{}}
        optiongroups[optId] = optiongroup
    }

https://go.dev/play/p/1eS3aABYKtm

© www.soinside.com 2019 - 2024. All rights reserved.