Найдите родительский узел, передав дочерний узел с помощью PowerShell из JSON. - PullRequest
0 голосов
/ 16 октября 2019

У меня есть файл JSON, как показано ниже.

{
    "pr": {
        "nv": "1234.0.0.234",
        "ps": [{
                "nv": "1234.1.1.235",
                "fh": [{
                        "nv": ""
                    },
                    {
                        "nv": ""
                    }
                ]
            },
            {
                "nv": "1234.102.000.579",
                "fh": [{
                        "nv": ""
                    },
                    {
                        "nv": ""
                    }
                ]
            },
            {
                "nv": "1234.103.000.111",
                "fh": [{
                        "nv": ""
                    },
                    {
                        "nv": ""
                    }
                ]
            },
            {
                "nv": "1234.104.000.134",
                "fh": [{
                        "nv": ""
                    },
                    {
                        "nv": ""
                    }
                ],
                "SP": [{
                        "nv": "1234.105.000.245",
                        "fh": [{
                                "nv": ""
                            },
                            {
                                "nv": ""
                            }
                        ]
                    },
                    {
                        "nv": "1234.106.000.306",
                        "fh": [{
                                "nv": ""
                            },
                            {

                                "nv": ""
                            }
                        ]
                    }
                ]
            }
        ],
        "pr": {
            "nv": "2234.000.000.115",
            "ps": [{
                    "nv": "1234.1.1.235",
                    "fh": [{
                            "nv": ""
                        },
                        {
                            "nv": ""
                        }
                    ]
                },
                {
                    "nv": "2234.102.000.579",
                    "fh": [{
                            "nv": ""
                        },
                        {
                            "nv": ""
                        }
                    ]
                },
                {
                    "nv": "2234.103.000.111",
                    "fh": [{
                            "nv": ""
                        },
                        {
                            "nv": ""
                        }
                    ]
                },
                {
                    "nv": "2234.104.000.134",
                    "fh": [{
                            "nv": ""
                        },
                        {
                            "nv": ""
                        }
                    ],
                    "SP": [{
                            "nv": "2234.105.000.245",
                            "fh": [{
                                    "nv": ""
                                },
                                {
                                    "nv": ""
                                }
                            ]
                        },
                        {
                            "nv": "2234.106.000.306",
                            "fh": [{
                                    "nv": ""
                                },
                                {
                                    "nv": ""
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}

Я хочу прочитать версии зависимостей данной версии. Например, если я предоставляю версию 2234.106.000.306, он должен вернуть массив значений
[1234.0.0.234,2234.000.000.115,2234.104.000.134,2234.106.000.306].

Я могу сделатьэто с помощью цикла foreach. Но я хотел бы знать, есть ли какой-либо другой лучший способ добиться этого

$tv = "1234.106.000.306"
$dv = @()

function Processependency($splist) {
    foreach ($ps in $splist) {
        if ($ps.nv -eq $tv) {
            $dv += $ps.nv
            return $dv
        }
        foreach ($fh in $ps.fh) {
            if ($fh.nv -eq $tv) {
                $dv += $fh.nv
                return $dv
            }
        }
        foreach ($SP in $ps.SP) {
            if ($SP.nv -eq $tv) {
                $dv += $ps.nv
                $dv += $SP.nv
                return $dv
            }
        }
    }
}

$JsonFile = Get-Content -Raw -Path $Filepath | ConvertFrom-Json

foreach ($pr in $JsonFile.pr) {
    $dv += $pr.nv
    if ($pr.nv -eq $tv) {
        return ($dv)
    } else {
        $dv = Processependency($pr.ps)
    }
}

1 Ответ

1 голос
/ 16 октября 2019

Рекурсия проще, чем итерация, когда дело доходит до таких задач.

function List-Dependencies($data, $version) {
    if ($data.nv -eq $version) {
        # if version attribute has the specified version: return the value
        return $data.nv
    } else {
        # otherwise recurse into the other properties
        $result = @($data.PSObject.Properties.Name | Where-Object {
            $_ -ne 'nv'
        } | ForEach-Object {
            $data.$_ | ForEach-Object { List-Dependencies $_ $version }
        })
        # and return the result (append the version number of the current node if
        # it has one)
        if ($result) {
            if ($data.nv) { $result += $data.nv }
            return $result
        }
    }
}

Это будет повторяться в ваших данных до тех пор, пока он не найдет заданную строку версии или не останется ни одного дочернего узла. Если строка версии найдена, она возвращается, и по мере того, как вызовы пересекают номера версий от родительских узлов, добавляются обратно.

В результате номера версий будут в порядке, противоположном указанному (самый верхний узел). последний), поэтому, если они вам нужны в обратном порядке, вам нужно либо поменять местами результат, либо добавить версию родительского узла к $result вместо добавления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...