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

问题描述 投票:1回答:1

我的榆树模型中有一个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 )
arrays list elm
1个回答
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扔在一起,你可以比较两个版本。

© www.soinside.com 2019 - 2024. All rights reserved.