【问题标题】:Remove item of record without knowing all item在不知道所有项目的情况下删除记录项目
【发布时间】:2017-12-16 01:21:43
【问题描述】:

我有这个模拟:

 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 的“额外”:

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

我可以通过映射整个列表并通过删除“额外”出现来生成一个新列表来做到这一点:

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

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

【问题讨论】:

  • 你为什么要删除一个字段?为什么不用 `{ name, age, price }` 创建一个新的类型别名?
  • @naomik,因为在我正在开发的项目中,它有 +50 种类型,我需要做与记录 1 或 2 项相同的事情。原因:我需要以 .csv 格式导出,我不希望“额外”出现。
  • 我建议您阅读 Elm 中的 Json 编码/解码。相同的规则将适用于编码 Csv - 我只说阅读 Json 是因为您可能会找到更适用的搜索结果
  • 我理解你的回答。但是,在创建 Json 的工作和执行这项古老的工作之间。抱歉,我更喜欢古老的方式。
  • 我不明白你的意思

标签: elm


【解决方案1】:

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

例如,假设您有两种类型,带有 name 和 age 字段,并且有一个额外的不兼容字段:

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

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

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

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

【讨论】:

  • 出于性能原因,我将处于老式模式(因为我只需要在每个系统上对每种类型使用一次)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多