为什么 PowerShell 会自动展平数组?

Why does PowerShell flatten arrays automatically?

我写了一些 pwsh 代码

"a:b;c:d;e:f".Split(";") | ForEach-Object { $_.Split(":") }
# => @(a, b, c, d, e, f)

但我想要这个

// in javascript
"a:b;c:d;e:f".split(";").map(str => str.split(":"))
[ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ]

嵌套数组

@(
    @(a, b),
    @(c, d),
    @(e, f),
)

为什么?我该怎么办

使用 , 的一元形式,PowerShell 的 array-construction 运算符:

"a:b;c:d;e:f".Split(";") | ForEach-Object { , $_.Split(":") }

这样,$_.Split(":") 返回的数组实际上作为 数组 输出 as-is,而不是将其元素输出 ]一个接一个,这在 PowerShell 管道中默认发生。

, 创建一个 - transient - wrapper array 其唯一元素是您要输出的数组。 PowerShell 然后 解包 输出的包装器数组,将包装的数组传递给它。

使用foreach-object,解包数组通常很有用:

ps | foreach modules | sort -u modulename

您也可以创建堆栈或队列。 下面,我用你的数组创建了一个堆栈。

$array = "a:b;c:d;e:f".Split(";")
$stack = New-Object -TypeName System.Collections.Stack
$array | ForEach-Object { $stack.Push($_.Split(":")) }

从这里开始,最常用的方法是 .Push() 将新项目插入堆栈,.Peek() 使用堆栈的第一项和 .Pop(),检索然后删除第一项。

您提到要创建一个数组。这也可以通过使用 ToArray() 方法实现。

$stackArray = $stack.ToArray()
$stackArray[2]
> a
> b

请记住,创建堆栈会颠倒项目的顺序。