2016-10-05 4 views
0

私はさまざまな種類のデータを取り出すソート可能なテーブルを作成しようとしています。グリッドとしてレンダリングする前に、すべてのデータをString(ビュー)に変換します。しかし、elmは文字列に変換された浮動小数点数または整数のリストを正しくソートすることはできません(1、1001、10.03、21、3.4、...などのようになります)。 私はそれが、その後StrColある、またはINT場合INTCOLなど、及び場合はいくつかの点で私は、文字列に戻って変換する必要がある、しかし、浮動小数点数、整数、または文字列の並べ替えのリスト

type ColType 
    = StrCol String 
    | IntCol String 
    | FloatCol String 
    | BoolCol String 

をユニオン型を作成するためのアイデアを持っていましたソート;しかし、私はこれを行う方法がわかりません。

ありがとうございました。

答えて

0

あなただけの文字列に、各タグの内容を変換する関数を作成することができます。ここでは

colTypeToString : ColType -> String 
colTypeToString colType = 
    case colType of 
     StrCol x -> toString x 
     IntCol x -> toString x 
     FloatCol x -> toString x 
     BoolCol x -> toString x 
+0

しかし、私は元の問題に戻ります。最初にintまたはfloatを文字列に変換すると、ソートは正しい結果を返しません。 ColTypeからStrColの場合はStringに、IntColの場合はIntに、次にソートしてからColTypeに、次にStringに変換する必要があります。 別の方法がある場合は、お気軽にお申し出ください。重要なことは、辞書の値が前回のIntかStringかどうかをチェックしてからStringまたはIntsのリストとしてソートし、DictをStringとしてテーブルにレンダリングする必要があることですフィールド。 –

+0

データは 'view'関数で文字列に変換されるだけで、データは既にそれによってソートされているはずです。代わりに、モデルに表示する文字列として値を格納していますか?質問にコンテキストを追加することができれば(ソートがレンダリングと関連してどこで行われるかのコードスニペット)、問題の領域をよりよく理解できます。 –

+0

私は辞書のリストとしてデータを格納し、フィールドはすべて同じ型でなければなりません。私はList Dictにあらゆる種類の変更を加えます。ソートは単なる1つです。私は、レコードのリストを変更する代わりにそれらの関数を書き直すことができ、ビューがレンダリングされるたびにdictのリストにレコードのリストを変換することができます。 –

0

は、あなたが試みることができる例です。

私は 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) 
関連する問題