为什么 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
请记住,创建堆栈会颠倒项目的顺序。
我写了一些 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
请记住,创建堆栈会颠倒项目的顺序。