【问题标题】:Why does PowerShell flatten arrays automatically?为什么 PowerShell 会自动展平数组?
【发布时间】:2019-07-14 00:00:06
【问题描述】:

我写了一些 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),
)

为什么?我该怎么办

【问题讨论】:

    标签: arrays powershell pipeline jagged-arrays


    【解决方案1】:

    使用一元形式的,,PowerShell 的数组构造运算符:

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

    这样,$_.Split(":") 返回的数组实际上是按原样输出的,作为一个数组,而不是让其元素一个接一个输出,这会发生默认情况下在 PowerShell 管道中。

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

    【讨论】:

      【解决方案2】:

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

      ps | foreach modules | sort -u modulename
      

      【讨论】:

        【解决方案3】:

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

        $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
        

        请记住,创建堆栈将反转项目的顺序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-03
          • 2017-06-15
          • 2018-10-26
          • 1970-01-01
          • 1970-01-01
          • 2019-09-02
          • 2021-10-06
          • 1970-01-01
          相关资源
          最近更新 更多