根据第二个数组过滤数组?

Filtering an array based on a second array?

我有两个数据数组:

$arrnames=('a','b','c')
$arrtypes=('x','y','z')

我有一个查找数组:

$arrlookup=('y','z')

我需要 return $arrnames 中的元素,其中 $arrtypes 中的匹配元素包含在 $arrlookup 中。我一直在玩 foreach 遍历 $arrnames 并按索引查看 $arrtypes 中的相同元素,但它变得草率,我知道必须有更好的方法。

我见过一些类似的问题,但没有任何让我印象深刻的专门回答这个问题的问题。作为 Powershell 的新手,我仍在学习如何根据我的需要调整示例。非常感谢任何帮助。

我的代码(应用于上述示例的技术 - 实际代码使用从 XML 文件派生的复杂数组,并且有很多调试代码,因此 copy/paste 不切实际)

foreach ($a in $arrnames) {
    $t=$arrtypes[$arrnames.IndexOf($a)]
    if ($arrlookup.Contains($t)) {
       $arrresult+=$a
    }
)

$arrresult 应该包含 $arrnames 的成员,其类型(来自 $arrtypes)在 $arrlookup 中。

有没有一种方法可以使用对象方法、过滤和管道来简单地提取元素而无需 foreach 循环

编辑 - 这是创建实际数组的实际代码 - $builds 是一个 XML 文档:

$names=$builds.builds.project.name
$types=$builds.builds.project.type

查询 table 已知:

$FXCopTypes=@('batch','component','web')

我也可以控制 XML 文件,但我看不出有什么方法可以比使用上述数组实现散列 table 代码更能简化它。

我认为您需要更改您的输入才能在这里做任何不同的事情。您要求的是 $arrnames$arrtypes 真正成为哈希 table。这样您就可以使用键访问值。

就目前而言,我会这样做来创建散列table。第二个循环显示如何 return 每个匹配值。

$hash = @{} 

for($index = 0; $index -lt $arrtypes.Count; $index++){
    $hash.($arrtypes[$index]) =  $arrnames[$index]      
}

$arrresult = $arrlookup | ForEach-Object{
    $hash[$_]
}

这会 return

b
c

如果您可以获得创建该散列的输入 table,那么它就减少了重建它的需要。另外,如果您事先也知道查找,则可以对其进行过滤,然后只获得所需的输出。