在Powershell中展平嵌套数组

Tom*_*lak 6 powershell

鉴于此输入:

$values = @(1, @(2, 3), $null, @(@(4), 5), 6)
Run Code Online (Sandbox Code Playgroud)

什么是创建一个干净的迭代/管道

1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

条件:

  • 它不应该包含$null在输出中.
  • 即使输入为$ null或者所有输入的值都是$ null,它也应该导致一个空数组.

奖金:

  • 它应该显示[1,2,3,4,5,6]为结果ConvertTo-Json -Compress
  • 它应该优选地是干净且令人难忘的,即优选非拜占庭式管道操作,如果可能的话,不依赖于自定义功能.

在PowerShell中看过Flatten数组,那里的解决方案似乎不符合条件.

den*_*lah 9

@(1, @(2, 3), $null, @(@(4), 5), 6) | %{$_} | ?{$_ -ne $null}

输出:

1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)

ForEach-Object小命令(%)由缺省变平阵列.


Mat*_*att 5

为了完整起见,因为它可能会帮助其他用户,我想包含一个非常简单的递归函数,它涵盖了您的大部分标准,除了......

它最好应该是干净且令人难忘的,即首选非拜占庭管道操作,不依赖于自定义函数(如果可能的话)。

我知道[你]自己可以做到这一点,但也许它可以帮助别人。我在谈论 PowerShell 时看到过这一点,称为展开数组。如果您继续搜索,该词可能会带来更多成果。

使用$input它的意图,我们创建了一个相当简单的函数。如果传递的元素之一是数组元素,那么我们再次调用该函数,直到减少为原始值。

function Flatten-Array{
    $input | ForEach-Object{
        if ($_ -is [array]){$_ | Flatten-Array}else{$_}
    } | Where-Object{![string]::IsNullorEmpty($_)}
    # | Where-Object{$_} would also work.
}
Run Code Online (Sandbox Code Playgroud)

所以一个示例调用是

@(1, @(2, 3), $null, @(@(4), 5), 6) | Flatten-Array | ConvertTo-Json -Compress
Run Code Online (Sandbox Code Playgroud)

哪个网[1,2,3,4,5,6]$nulls 包含几个简单Where子句之一。