移动Elm列表元素的更好方法

时间:2019-02-15 15:38:49

标签: arrays list elm

我的Elm模型中有一个List。在包含元素的上一个索引和下一个索引(均从零开始)的Drag消息中,我想移动该元素。这是我现在使用的代码。我首先转换为Array,然后使用切片重新排列数组,最后转换回List。有没有更好的方法(也许不涉及数组)。请注意,列表中最多只能包含5个项目。

Drag { prev, next } ->
    let
        arr =
            Array.fromList model.list

        temp =
            Array.append
                (Array.slice 0 prev arr)
                (Array.slice (prev + 1) (Array.length arr) arr)

        list_ =
            Array.toList <|
                Array.append
                    (Array.append
                        (Array.slice 0 next temp)
                        (Array.slice prev (prev + 1) arr)
                    )
                    (Array.slice next (Array.length temp) temp)

        model_ =
            { model | list = list_ }
    in
    ( model_, Cmd.none )

1 个答案:

答案 0 :(得分:3)

如果您发现自己经常使用Array.slice,那么值得看看List.takeList.drop函数,看看它们是否可以满足您的需求!

以您的示例为例,可以使用List.takeList.dropList.concat进行重写:

Drag { prev, next } ->
    let
        item =
            List.drop prev model.list
                |> List.take 1

        rest =
            List.concat
                [ List.take prev model.list
                , List.drop (prev + 1) model.list
                ]

        reorderedList =
            List.concat
                [ List.take next rest
                , item
                , List.drop next rest
                ]

        updatedModel =
            { model | list = reorderedList }
    in
        ( updatedModel, Cmd.none )

我快速整理了一个demo in Ellie,您可以在其中比较两个版本。