在不知道所有项目的情况下删除记录项

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

我有这个模拟:

 init : (Model, Cmd Msg)
    init = ({ dog = List Dog }, Cmd.none)

    type alias Dog =
      { name : String
      , age : Int
      , price : Float
      , extra = List Extra
      }

    type alias Extra =
      { allergies : List String
      , wishes : List String
      }


    [{ name = "Hot"
     , age = 1
     , price = 300.5
     , extra = [{...}]
     },
     { name = "Dog"
     , age = 3
     , price = 150.0
     , extra = [{...}]
    }]

我想在代码的确定部分中仅删除Dog的'extras':

[{ name = "Hot"
 , age = 1
 , price = 300.5
 },
 { name = "Dog"
 , age = 3
 , price = 150.0
}]

我可以通过映射整个列表并通过删除'extra'出现来生成一个新列表:

removeExtraOfDogs dogList =  
     (dogList |> List.map (\dog ->
          { name = dog.name
          , age = dog.age
          , price = dog.price
          }
        )) 

但我想让它动态,只需传递额外的删除,而不必知道类型中有哪些变量并重新创建它

elm
1个回答
4
投票

榆树过去有这个功能,但it was removed a while ago。但是,根据您在评论中描述的用例,我认为您不需要此功能。您可以改为使用Elm的可扩展记录功能,只要它们包含一组固定的字段,就可以将不同的记录传递给函数。

例如,假设你有两种类型的nameage字段,并且有一个额外的不兼容字段:

type alias Foo = { name : String, age : Int, extra : List String }
type alias Bar = { name : String, age : Int, extra : Int }

您可以定义一个函数,该函数使用name类型的String字段和age类型的Int以及任何额外字段获取记录:

encode : { r | name : String, age : Int } -> String
encode record = record.name ++ "," ++ toString record.age

您现在可以将FooBar传递给此函数,因为它们都满足类型签名的要求。

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