2016-10-27 2 views
-2

У меня есть следующий список Value, который я бы хотел сортировать по delta ключам.Сортировка [Значение] по ключу

{-# LANGUAGE Haskell2010 #-} 
{-# LANGUAGE OverloadedStrings #-} 
import Data.Aeson 

lists :: [Value] 
lists = 
    [ object ["label" .= String "foo", "delta" .= Number 2] 
    , object ["label" .= String "bar", "delta" .= Number 3] 
    , object ["label" .= String "baz", "delta" .= Number 1] 
    ] 
+0

Вы используете эзон? Пожалуйста, обновите свой вопрос, чтобы отразить это; лучше всего добавить строку импорта. –

+0

Да, используя Aeson. Я добавил тег к вопросу. – amitaibu

ответ

1

Это связано со структурой Эзона. Я отправлю код без особых объяснений, кроме «sortBy и comparing ваши друзья»:

import Data.Aeson.Types (parseMaybe, Value, Parser) 
import Data.Ord (comparing) 
import Data.List (sortBy) 
import Data.Scientific (Scientific) 
import Data.Text (Text) 

sortByKeyForNumberField :: Text -> [Value] -> [Value] 
sortByKeyForNumberField key = sortBy (comparing $ parseMaybe parserFunction) 
    where 
    parserFunction :: Value -> Parser Scientific 
    parserFunction = withObject "some object" (.: key) 

Вы можете рассчитать необходимый список путем оценки sortByKeyForNumberField "delta" lists.

Тем не менее, вам намного лучше разобрать Асонский АСТ для значимого типа данных (который вам нужно будет определить самостоятельно, потому что вы знаете приложение) и реализуете сортировку для него. Эсон действительно выполнен как АСТ для синтаксического анализа и рендеринга JSON, а не для манипулирования JSON.

+0

Спасибо. Можете ли вы указать указатель на то, что вы подразумеваете под «анализом Азона Азона к содержательному типу данных». – amitaibu

+1

Определите тип данных, который подходит вашему приложению (что означает объект с меткой '' и 'delta' * означает *?), Реализует функции для его обработки (например, функцию доступа для «дельта», чтобы вы могли используйте его с 'sortBy') и реализуйте для него парсер (обычно создавая« экземпляр FromJSON YourDataType »). –

+0

О, я вижу - имеет смысл. Действительно, в моем реальном случае (т. Е. Не в упрощенной версии вопроса) мой список «Значение» происходит из правильно определенных типов. Это выполняется с помощью 'mappend', который содержит список' Entity' 'entityIdToJSON' persistent'. Поэтому я думаю, что должен использовать код, как вы опубликовали в ответ, или есть лучший способ? - https://gist.github.com/amitaibu/6b43645692addceebff2548cf2add0b7#file-example-hs-L13 – amitaibu

Смежные вопросы