我发现一些 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