PowerShell: get all descendants
Again?
It's kind of like this one, but this time in PowerShell.
I wrote this up because I was considering doing this outside of Power Query. Recursive functions can take up a lot of processing time, and if I can move this out of the PQ flow, I can speed up the overall refresh speed.
using namespace System.Collections.Generic; # for List
<#
This is the source data
"Name","Parent"
"Anakin Skywalker","Shmi Skywalker"
"Luke Skywalker","Anakin Skywalker"
"Leia Organa","Anakin Skywalker"
"Ben Skywalker","Luke Skywalker"
"Jaina Solo","Leia Organa"
"Jacen Solo","Leia Organa"
"Anakin Solo","Leia Organa"
"Allana Solo","Jacen Solo"
#>
$data = (Get-Content "./source.csv") | ConvertFrom-Csv -Delimiter ","
function getSubordinates ([string] $target) {
return $data | Where-Object { $_.Parent -eq $target }
}
function getNextSubordinates ([List[string]] $targets) {
return $targets |
ForEach-Object {
getSubordinates $_
}
}
function recurse ([List[string]] $targets) {
if ($targets.Count -ne 0) {
$subordinates = $targets | ForEach-Object {
getNextSubordinates $_
}
$subordinates | ForEach-Object {
[void] $out.Add($_.Name)
}
recurse $subordinates.Name
}
}
[List[PSCustomObject]] $out = @()
[List[string]] $targets = @('Shmi Skywalker')
recurse $targets
$out