比较两个相似对象的数组,以及唯一属性的列表

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