ELM获取并解码两个或多个字段

时间:2018-11-17 01:46:06

标签: functional-programming elm

我是榆树的新手。现在,我试图发出请求。

请求返回一个对象数组。实际上,这些是搜索结果,其中数组中的每个对象= price和productId。

结构:

data: [
        {
          price: 7,
          productId: 12
        },
        {
          price: 4,
          productId: 2
        }
    ]

此刻,我只得到一系列价格:

getApiPrice: Flags -> Cmd Msg
getApiPrice params =
    Http.send NewPrice (Http.get (apiUrlConstructor params) Decoders.priceDecoder)

priceDecoder: Decode.Decoder (List Float)
priceDecoder =
    Decode.field "data" (Decode.list (Decode.field "priceRub" Decode.float))

然后,我对数组进行排序并获取第一个元素(我需要价格最低的结果)

现在,我需要productId字段。我可以在请求中进行排序,以获取具有最低价格和其productId的对象(或元组)。

1 个答案:

答案 0 :(得分:3)

其中一种选择是将您的数据解码为价格列表中间的产品记录列表。然后,它将足够灵活以获取handleInputChange(event) { const value = event.target.value; const name = event.target.name; this.setState({ [name]: value }); } price和将来可能出现的任何其他字段:

productId

我假设您正在处理type alias Product = { price : Float, productId: Int } productDecoder : Decode.Decoder Product productDecoder = Decode.map2 Product (Decode.field "price" Decode.float) (Decode.field "productId" Decode.int) decoder: Decode.Decoder (List Product) decoder = Decode.field "data" (Decode.list productDecoder) 消息时在update函数中对列表进行排序。我仍然可以使用List.sortBy函数在此完成操作。或者,列表可以在NewPrice的帮助下直接在decoder中排序:

Decode.map

现在,在decoder: Decode.Decoder (List Product) decoder = Decode.map (List.sortBy .price) (Decode.field "data" (Decode.list productDecoder)) 消息中收到了已排序的列表。剩下的唯一步骤-在NewPrice函数或update中使用List.head再次获得第一个元素:

decoder

这里是ellie-app,用于演示。