我的榆树模型中有一个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 )
如果您发现自己经常使用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扔在一起,你可以比较两个版本。