我有以下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 :(得分:1)
由于Aeson的结构,这涉及到更多。我会在没有太多解释的情况下发布代码,除了“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
来计算所需的列表。
但是,最好将Aeson的AST解析为有意义的数据类型(您必须自己定义,因为您知道应用程序)并实现对它的排序。 Aeson实际上是用作解析和渲染JSON的AST,而不是用于操作JSON。