我的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 )
答案 0 :(得分:3)
如果您发现自己经常使用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 )
我快速整理了一个demo in Ellie,您可以在其中比较两个版本。