は、あなたが試みることができる例です。
私は Value
ではなく ColType
(ご提案)を定義する、Float
またはString
のいずれかになりますデータの記録を表現するためにDict
を使用。 (他のcomparable
タイプをサポートするために拡張が容易です)
-- MODEL
type alias Model =
{ rows : List Row
, cols : List String
, sortkey : Maybe String
}
type alias Row = Dict.Dict String Value
createRow : String -> Float -> Row
createRow name val = Dict.fromList
[ ("name", StrValue name)
, ("value", FloatValue val)
]
type Value
= StrValue String
| FloatValue Float
init : (Model, Cmd Msg)
init =
let
rows =
[ createRow "A" 1.5
, createRow "B" 0.5
]
cols = ["name", "value"]
sortkey = Nothing
in (Model rows cols sortkey, Cmd.none)
-- VIEW
view : Model -> Html Msg
view model =
let
renderRow cols row = tr [] <| List.map (renderValue row) cols
renderValue row key = case (Dict.get key row) of
Just (StrValue str) -> td [] [text str]
Just (FloatValue num) -> td [] [text <| toString num]
_ -> td [] [text "-"]
renderHeaders cols = tr []
<| List.map renderHeaderName model.cols
renderHeaderName colname =
th [ onClick (Sort colname) ]
<| if Just colname == model.sortkey
then [ text <| colname ++ "*" ]
else [ text colname ]
in
table []
<| [ renderHeaders model.cols ]
++ List.map (renderRow model.cols) model.rows
-- UPDATE
type Msg
= Sort String
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Sort name ->
let
sortedRows = List.sortWith compareVal model.rows
compareVal a b = case (Dict.get name a, Dict.get name b) of
(Just (StrValue sa), Just (StrValue sb)) -> compare sa sb
(Just (FloatValue na), Just (FloatValue nb)) -> compare na nb
_ -> EQ
in ({ model | rows = sortedRows, sortkey = Just name }, Cmd.none)
しかし、私は元の問題に戻ります。最初にintまたはfloatを文字列に変換すると、ソートは正しい結果を返しません。 ColTypeからStrColの場合はStringに、IntColの場合はIntに、次にソートしてからColTypeに、次にStringに変換する必要があります。 別の方法がある場合は、お気軽にお申し出ください。重要なことは、辞書の値が前回のIntかStringかどうかをチェックしてからStringまたはIntsのリストとしてソートし、DictをStringとしてテーブルにレンダリングする必要があることですフィールド。 –
データは 'view'関数で文字列に変換されるだけで、データは既にそれによってソートされているはずです。代わりに、モデルに表示する文字列として値を格納していますか?質問にコンテキストを追加することができれば(ソートがレンダリングと関連してどこで行われるかのコードスニペット)、問題の領域をよりよく理解できます。 –
私は辞書のリストとしてデータを格納し、フィールドはすべて同じ型でなければなりません。私はList Dictにあらゆる種類の変更を加えます。ソートは単なる1つです。私は、レコードのリストを変更する代わりにそれらの関数を書き直すことができ、ビューがレンダリングされるたびにdictのリストにレコードのリストを変換することができます。 –