Лучший способ переместить элемент списка Вязов - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть List в моей модели Elm.В сообщении 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 голосов
/ 15 февраля 2019

Если вы часто используете Array.slice, стоит взглянуть на функции List.take и List.drop, чтобы узнать, могут ли ониделайте то, что вам нужно!

Для вашего примера его можно переписать с помощью List.take, List.drop и List.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 )

Я бросилвместе быстрое демо в Ellie , в котором вы можете сравнить две версии.

...