Сравнение двух массивов похожих объектов, а также список уникальных свойств - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть два массива пользовательских объектов - $ deploy и $ directory. У них 4 общих свойства и 1 уникальное свойство. Мне нужно найти элементы обоих массивов, где 4 общих свойства одинаковы, но мне нужно отследить и 2 уникальных свойства для совпадений.

Использование сравнить объект на двух массивах с определенными одинаковыми свойствами, -passthru и -includeequal - это почти то же самое, но дает мне только первый (ссылочный) объект с его уникальным свойством, а не уникальное свойство объекта разности.

Так что я не могу просто сравнить два массива и получить то, что мне нужно. Мне либо нужно сделать вложенный цикл, либо взломать / найти какую-то функцию «установки пересечения». Я буду иметь дело только с несколькими дюжинами членов каждого массива, так что я не слишком обеспокоен производительностью.

Какой подход вы бы выбрали? В приведенном ниже простом примере я хотел бы, чтобы и имя среды, и каталог развертывания отслеживались для всех совпадений.

$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

1 Ответ

0 голосов
/ 03 ноября 2018

Возможно, это не самый быстрый подход, но вот что я придумал:

# 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
...