根据第二个数组过滤数组?
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,那么它就减少了重建它的需要。另外,如果您事先也知道查找,则可以对其进行过滤,然后只获得所需的输出。
我有两个数据数组:
$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,那么它就减少了重建它的需要。另外,如果您事先也知道查找,则可以对其进行过滤,然后只获得所需的输出。