You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell如何排除空数组计算多个字符串数组的交集

PowerShell 多非空数组交集计算方案

问题场景

使用PowerShell时定义了14个字符串数组,其中部分为空数组,需要计算所有非空数组的公共交集(即存在于每一个非空数组中的元素),空数组不参与比对,同时避免逐一两两比较数组的冗余实现。
测试用数组定义如下:

$a = @('hjiejnfnfsd','test','huiwe','test2')
$b = @('test','jnfijweofnew','test2')
$c = @('njwifqbfiwej','test','jnfijweofnew','test2')
$d = @('bhfeukefwgu','test','dasdwdv','test2','hfuweihfei')
$e = @('test','ddwadfedgnh','test2')
$f = @('test','test2')
$g = @('test','bjiewbnefw','test2')
$h = @('uie287278hfjf','test','huiwhiwe','test2')
$i = @()
$j = @()
$k = @('jireohngi','test','gu7y8732hbj','test2')
$l = @()
$m = @('test','test2')
$n = @('test','test2')

原有实现的问题

之前的实现未做空数组校验,逐次调用Compare-Object两两比对累计交集,遇到空数组时会返回错误结果,预期交集结果应包含test、test2两个元素。原有错误实现如下:

$overlap = Compare-Object $a $b -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $c -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $d -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $e -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $f -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $g -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $h -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $i -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $j -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $k -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $l -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $m -PassThru -IncludeEqual -ExcludeDifferent
$overlap = Compare-Object $overlap $n -PassThru -IncludeEqual -ExcludeDifferent

实现方案

核心逻辑分两步:先过滤所有空数组,再基于元素存在性校验计算交集,无需手动逐一两两比对。

# 归集所有待比对数组,自动过滤空数组
$nonEmptyArrays = @($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n) | Where-Object { $_.Count -gt 0 }

# 计算所有非空数组的交集
$overlap = $nonEmptyArrays[0] | Where-Object {
    $currentItem = $_
    # 校验当前元素是否在所有剩余非空数组中都存在
    ($nonEmptyArrays | Select-Object -Skip 1 | ForEach-Object { $_ -contains $currentItem }) -notcontains $false
}

逻辑说明

  • 空数组过滤:通过$_.Count -gt 0判断数组长度,直接排除所有无有效元素的空数组,从源头避免空值干扰比对结果
  • 交集计算:取第一个非空数组的元素作为校验基准,逐个检查元素是否在其余所有非空数组中存在,只要有一个数组不包含该元素就直接排除,最终留存的就是所有非空数组的公共元素
  • 扩展性:后续增减待比对数组时,只需要修改$nonEmptyArrays初始化时的数组列表即可,不需要重复写比对代码

执行上述代码后,$overlap返回结果为test和test2,符合预期。


内容的提问来源于stack exchange,提问作者MaxRax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:21:11