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

时间:2015-11-25 15:36:20

标签: arrays powershell comparison

我有两个数据阵列:

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

我有一个查找数组:

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

我需要返回$arrnames中{$ 1}}中包含$ arrtypes中匹配元素的元素。我一直在玩$arrlookup循环foreach并通过索引查看$arrnames中的相同元素,但它变得草率,我知道必须有更好的方法。

我已经看到了一些类似的问题,但没有任何让我特别回答这个问题的事情。作为一个Powershell非常新手,我还在学习如何根据我的需求调整示例。非常感谢任何帮助。

我的代码(应用于上述示例的技术 - 实际代码使用从XML文件派生的复杂数组,并且具有大量调试代码,因此复制/粘贴是不切实际的)

$arrtypes
$ arrresult应该包含$ arrnup的成员,这些成员的类型(来自$ arrtypes)位于$ arrlookup中。

有没有办法使用对象方法,过滤和管道来简单地提取没有foreach循环的元素

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

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

查找表已知:

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

我也可以控制XML文件,但是我没有看到任何方法来简化它,而不是实现哈希表代码,但是使用上面的数组。

1 个答案:

答案 0 :(得分:1)

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

目前我会这样做来创建哈希表。第二个循环显示如何返回每个匹配值。

$hash = @{} 

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

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

这将返回

b
c

如果您可以获得创建该哈希表的输入,那么它将减少重建它的需要。此外,如果您事先知道查找,那么您可以过滤它,然后只需要您想要的输出。