我发现一些 Vim 列表函数不能像我想象的那样工作。例如:
let list0 = [1, [1, 2]]
echo count(list0, 1)
它返回1
,但我希望它返回2
。所以我认为这些函数不能深入嵌套列表,只能在第一级工作。
我想在这里我应该将嵌套列表扩展为一个普通的列表,如下所示:
list0 = [1, 1, 2]
如何展平嵌套列表?
" 代码来自 bairu@#vim.freenode " https://gist.github.com/3322468 功能!展平(列表) 让 val = [] 对于 a:list 中的元素 如果类型(元素)== 类型([]) 调用extend(val, Flatten(elem)) 别的 调用 add(val, elem) 万一 不让元素 结束 返回值 结束功能
这里unlet elem
是必要的。因为elem
变量在变化,它是一个列表项,或者说是一个列表,而 VimL 不支持将一个列表项赋值给一个列表,反之亦然。
您可以reduce()
从 8.2.0878 开始使用:
let mylist = [[1, 2], [3, 4], 5]
echo reduce(mylist, { acc, val -> type(val) == 3 ? extend(acc, val) : add(acc, val)})
输出:
[1, 2, 3, 4, 5]
我建议vital.vim 的Data.List.flatten 作为另一个答案;D