如何从复杂的地图中删除一个键?

我知道这个功能delete(...)。但我有一组地图:


[

  {key: "aa", value1: 1, value2: "33"},

  {key: "bb", value1: 23, value2: "333"},

  {key: "cc", value1: 33, value2: "3366"},

  {key: "yy", value1: 99, value2: "666"},

  // other items

]

我将如何从这个结构中删除具有某些key-s 的项目?比方说,key == "bb"和key == "yy"


请注意,此数组的实际大小更大 - 数十或数百个项目。因此,我更喜欢高性能的解决方案。


呼啦一阵风
浏览 89回答 1
1回答

呼如林

您可以使用标准技巧在迭代时将切片中的内容向下移动,然后在最后截断。j := 0for _, v := range mySlice {    if v.key != "bb" && v.key != "yy" {        mySlice[j] = v        j++    }}mySlice = mySlice[:j]这使用 O(1) 额外内存,并且效率很高。在 go1.18 中,您将能够编写一个通用函数(通常称为过滤器)来进行切片。这是一个完整的示例,您也可以在 gotip 操场上运行。package mainimport "fmt"// filter returns a slice (reusing the backing array of m), that// contains all the elements of m for which f returns true.func filter[T any](m []T, f func(*T) bool) []T {    j := 0    for i := range m {        if f(&m[i]) {            m[j] = m[i]            j++        }    }    return m[:j]}type data struct {    key    string    value1 int    value2 string}func main() {    xs := []data{        {key: "aa", value1: 1, value2: "33"},        {key: "bb", value1: 23, value2: "333"},        {key: "cc", value1: 33, value2: "3366"},        {key: "yy", value1: 99, value2: "666"},    }    xs = filter(xs, func(x *data) bool { return x.key != "bb" && x.key != "yy" })    fmt.Println(xs)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go