我写了一些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),
)
为什么?以及我该怎么办
答案 0 :(得分:6)
使用,
(PowerShell的数组构造运算符)的一元形式:
"a:b;c:d;e:f".Split(";") | ForEach-Object { , $_.Split(":") }
这样,$_.Split(":")
返回的数组将按原样作为 array 输出,而不是使其元素逐个输出 ,默认情况下,这会在PowerShell管道中发生。
,
有效地创建了-瞬态-包装器数组,其唯一元素是您要输出的数组。然后,PowerShell 将输出的包装器数组解包,将包装的数组传递通过。
答案 1 :(得分:0)
对于foreach-object,解开数组通常很有用:
ps | foreach modules | sort -u modulename
答案 2 :(得分:0)
您也可以创建堆栈或队列。 下面,我用您的数组创建了一个堆栈。
$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
请记住,创建堆栈会颠倒商品的顺序。