ELM получить и декодировать два или более полей - PullRequest
0 голосов
/ 17 ноября 2018

Я новичок в вязе.Теперь я пытаюсь сделать запрос get.

Запрос возвращает мне массив объектов.Фактически это результаты поиска, где каждый объект в массиве = цена и идентификатор продукта.

Структура:

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 голосов
/ 17 ноября 2018

Одним из вариантов будет декодирование ваших данных в список записей о товарах, а также список цен. Тогда он будет достаточно гибким, чтобы получить 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 при обработке сообщения NewPrice. Я все еще могу сделать с помощью функции List.sortBy . Или список может быть отсортирован прямо в decoder с небольшой помощью Decode.map:

decoder: Decode.Decoder (List Product)
decoder =
    Decode.map (List.sortBy .price) (Decode.field "data" (Decode.list productDecoder))

Теперь отсортированный список получен в сообщении NewPrice. Остается только один шаг - снова получить первый элемент, используя List.head либо в функции update, либо в decoder:

decoder: Decode.Decoder (Maybe Product)
decoder =
    Decode.map ((List.sortBy .price) >> List.head) (Decode.field "data" (Decode.list productDecoder))

Вот ellie-app для демонстрационных целей.

...