按键排序[值]

时间:2016-10-27 23:01:54

标签: haskell aeson

我有以下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]
    ]

1 个答案:

答案 0 :(得分:1)

由于Aeson的结构,这涉及到更多。我会在没有太多解释的情况下发布代码,除了“sortBycomparing是您的朋友”之外:

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。