按键排序 [Value]
Sort [Value] by key
我有下面的 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]
]
由于 Aeson 的结构,这涉及更多。除了“sortBy
和 comparing
是你的朋友”之外,我 post 代码没有太多解释:
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 而不是用于操作 JSON.
的 AST
我有下面的 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]
]
由于 Aeson 的结构,这涉及更多。除了“sortBy
和 comparing
是你的朋友”之外,我 post 代码没有太多解释:
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 而不是用于操作 JSON.
的 AST