3

我发现一些 Vim 列表函数不能像我想象的那样工作。例如:

let list0 = [1, [1, 2]]
echo count(list0, 1)

它返回1,但我希望它返回2。所以我认为这些函数不能深入嵌套列表,只能在第一级工作。

我想在这里我应该将嵌套列表扩展为一个普通的列表,如下所示:

list0 = [1, 1, 2]

如何展平嵌套列表?

4

3 回答 3

3
" 代码来自 bairu@#vim.freenode
" https://gist.github.com/3322468
功能!展平(列表)
  让 val = []
  对于 a:list 中的元素
    如果类型(元素)== 类型([])
      调用extend(val, Flatten(elem))
    别的
      调用 add(val, elem)
    万一
    不让元素
  结束
  返回值
结束功能

这里unlet elem是必要的。因为elem变量在变化,它是一个列表项,或者说是一个列表,而 VimL 不支持将一个列表项赋值给一个列表,反之亦然。

于 2012-08-11T08:23:09.700 回答
0

您可以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]
于 2021-12-25T06:42:46.960 回答
0

我建议vital.vim 的Data.List.flatten 作为另一个答案;D

https://github.com/vim-jp/vital.vim

于 2018-11-30T00:46:30.420 回答