Flatten array in PowerShell

后端 未结 3 962
天涯浪人
天涯浪人 2021-02-07 01:29

Assume we have:

$a = @(1, @(2, @(3)))

I would like to flatten $a to get @(1, 2, 3).

I have found one solution

相关标签:
3条回答
  • 2021-02-07 02:09

    You can use .NET's String.Join method.

    [String]::Join("",$array)
    
    0 讨论(0)
  • 2021-02-07 02:11

    Piping is the correct way to flatten nested structures, so I'm not sure what would be more "elegant". Yes, the syntax is a bit line-noisy looking, but frankly quite serviceable.

    2020 Edit

    The recommended syntax these days is to expand % to ForEach-Object. A bit more verbose but definitely more readable:

    @($a | ForEach-Object {$_}).count
    
    0 讨论(0)
  • 2021-02-07 02:28

    Same code, just wrapped in function:

    function Flatten($a)
    {
        ,@($a | % {$_})
    }
    

    Testing:

    function AssertLength($expectedLength, $arr)
    {
        if($ExpectedLength -eq $arr.length) 
        {
            Write-Host "OK"
        }
        else 
        {
            Write-Host "FAILURE"
        }
    }
    
    # Tests
    AssertLength 0 (Flatten @())
    AssertLength 1 (Flatten 1)
    AssertLength 1 (Flatten @(1))
    AssertLength 2 (Flatten @(1, 2))
    AssertLength 2 (Flatten @(1, @(2)))
    AssertLength 3 (Flatten @(1, @(2, @(3))))
    
    0 讨论(0)
提交回复
热议问题