比较两个相似对象的数组,以及唯一属性的列表
Comparing two arrays of similar objects, with a list of the unique properties as well
我有两个自定义对象数组 - $deploy 和 $directory。它们有 4 个共同属性和 1 个 属性 是每个属性所独有的。我需要找到两个数组的成员,其中 4 个公共属性相同,但我还需要跟踪匹配项的 2 个唯一属性。
在具有定义的相同属性的两个数组上使用比较对象,-passthru 和 -includeequal 几乎是这样,但只给我第一个(参考)对象及其唯一 属性,而不是唯一属性 在差异对象上。
所以我不能简单地比较两个数组并得到我需要的。我要么需要做一个嵌套循环,要么破解 up/find 某种 "set intersection" 函数。我只会处理每个数组的几十个成员,所以我不太关心性能。
你会采取什么方法?对于下面的简单示例,我希望跟踪所有匹配项的环境名称和部署目录。
$deploy
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
environmentname : Staging35
$directory
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
deploymentDirectory : C:\deployer\script\deploy-AB
这可能不是最快的方法,但这是我想出的方法:
# create a string array storing the combined properties of the 4 common $deploy objects.
# convert these strings to lowercase, because later on we use IndexOf and that is case sensitive.
$commons = @()
$deploy | ForEach-Object {
$commons += $("{0},{1},{2},{3}" -f $_.GameBuildVersion, $_.OnlineVersion, $_.ContentVersion, $_.ContentBuildVersion).ToLower()
}
# create an array to store the objects both arrays have in common, combined with their unique properties
$result = @()
$directory | ForEach-Object {
$props = $("{0},{1},{2},{3}" -f $_.GameBuildVersion, $_.OnlineVersion, $_.ContentVersion, $_.ContentBuildVersion).ToLower()
$index = $commons.IndexOf($props)
if ($index -ge 0) {
$result += [PSCustomObject]@{
GameBuildVersion = $_.GameBuildVersion
OnlineVersion = $_.OnlineVersion
ContentVersion = $_.ContentVersion
ContentBuildVersion = $_.ContentBuildVersion
deploymentDirectory = $_.deploymentDirectory
environmentname = $deploy[$index].environmentname
}
}
}
# show the result (or export it to CSV or whatever)
$result
使用您提供的示例,这将产生:
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
deploymentDirectory : C:\deployer\script\deploy-AB
environmentname : Staging35
我有两个自定义对象数组 - $deploy 和 $directory。它们有 4 个共同属性和 1 个 属性 是每个属性所独有的。我需要找到两个数组的成员,其中 4 个公共属性相同,但我还需要跟踪匹配项的 2 个唯一属性。
在具有定义的相同属性的两个数组上使用比较对象,-passthru 和 -includeequal 几乎是这样,但只给我第一个(参考)对象及其唯一 属性,而不是唯一属性 在差异对象上。
所以我不能简单地比较两个数组并得到我需要的。我要么需要做一个嵌套循环,要么破解 up/find 某种 "set intersection" 函数。我只会处理每个数组的几十个成员,所以我不太关心性能。
你会采取什么方法?对于下面的简单示例,我希望跟踪所有匹配项的环境名称和部署目录。
$deploy
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
environmentname : Staging35
$directory
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
deploymentDirectory : C:\deployer\script\deploy-AB
这可能不是最快的方法,但这是我想出的方法:
# create a string array storing the combined properties of the 4 common $deploy objects.
# convert these strings to lowercase, because later on we use IndexOf and that is case sensitive.
$commons = @()
$deploy | ForEach-Object {
$commons += $("{0},{1},{2},{3}" -f $_.GameBuildVersion, $_.OnlineVersion, $_.ContentVersion, $_.ContentBuildVersion).ToLower()
}
# create an array to store the objects both arrays have in common, combined with their unique properties
$result = @()
$directory | ForEach-Object {
$props = $("{0},{1},{2},{3}" -f $_.GameBuildVersion, $_.OnlineVersion, $_.ContentVersion, $_.ContentBuildVersion).ToLower()
$index = $commons.IndexOf($props)
if ($index -ge 0) {
$result += [PSCustomObject]@{
GameBuildVersion = $_.GameBuildVersion
OnlineVersion = $_.OnlineVersion
ContentVersion = $_.ContentVersion
ContentBuildVersion = $_.ContentBuildVersion
deploymentDirectory = $_.deploymentDirectory
environmentname = $deploy[$index].environmentname
}
}
}
# show the result (or export it to CSV or whatever)
$result
使用您提供的示例,这将产生:
GameBuildVersion : 68858.zip
OnlineVersion : 70793.zip
ContentVersion : 68858.69165-1.zip
ContentBuildVersion : 69165-1.zip
deploymentDirectory : C:\deployer\script\deploy-AB
environmentname : Staging35