Создание функции для l oop через Powershell - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь создать функцию для файла от l oop до json и на основе указанного c условия хочу добавить значение ключей json в массив, но не могу выполнить sh то же самое.

Ниже приводится json:

$a1 = [    {
        "name": "sachin",
        "surname": "",
    },
    {
        "name": "Rajesh",
        "surname": "Mehta"

    }
]

, а созданная мною функция ниже:

function addingkeyval
{
param ($key,
        [Array]$tobeaddedarr)

$a1 | Select-Object -Property name,surname | ForEach-Object {
    if($_.$key-eq "")
    {
    }
    else
    {     
    $tobeaddedarr +=$_.$key+","
    }
}

}

, когда я вызываю эту функцию с помощью утверждение:

$surnamearr = @()
addingkeyval -key surname -tobeaddedarr $surnamearr

i want the output in the array $surnamearr as below
("Mehta")

почему-то я не могу добавить значение в массив, может ли кто-нибудь помочь мне в достижении того же

Ответы [ 2 ]

3 голосов
/ 05 мая 2020
$surnamearr = ([string[]] (ConvertFrom-Json $a1).surname) -ne ''
  • ConvertFrom-Json $a1 преобразует массив JSON в массив настраиваемых объектов PowerShell (тип [pscustomobject]).

  • (...).surname извлекает значения всех .surname свойств объектов в результирующем массиве, используя перечисление членов .

  • Cast [string[]] гарантирует, что результат будет обработан как массив (этого не было бы, если бы массив в $a1 содержал только один элемент) и явно приводил к строкам , так что фильтрация непустых значений через -ne '' также работает для входных объектов, которые не имеют свойства .surname.

  • -ne '' отфильтровывает все элементы с пустой строкой из результирующего массива (с массивом в качестве LHS, сравнение такие операторы, как -ne, действуют как фильтры массивов , а не возвращают логическое значение).

В результате $surnamearr представляет собой массив, содержащий все не- пустые .surname значения свойств.


Что касается что вы пробовали :

$tobeaddedarr +=$_.$key+","

Этот оператор неявно создает массив new , отличный от ссылки на массив, переданной вызывающей стороной через переменную параметра $tobeaddedarr - поэтому , вызывающий никогда не видит изменения.

Обычно вы не можете передать массив, который будет добавлен к на месте, потому что массивы неизменяемы по отношению к их количеству элементы.

Хотя вы могли передать изменяемую структуру, подобную массиву (например, [System.Collections.Generic.List[object]] экземпляр, который вы можете добавить с помощью его метода .Add()) , гораздо проще построить новый массив внутри функции и вывести его .

Следовательно, вы можете написать свою функцию как:

function get-keyval
{
  param ($key)

  # Implicitly output the elements of the array output by using this command.
  ([string[]] (ConvertFrom-Json $key).surname) -ne ''
}

$surnamearr = get-keyval surname

Примечание:

  • Вывод массива или коллекции в PowerShell по умолчанию перечисляет it: он отправляет свои элементы один за другим в выходной поток (конвейер) .

    • Хотя есть возможность вывести массив как wh ole через унарную форму ,, оператор построения массива (, (([string[]] (ConvertFrom-Json $a1).surname) -ne '')), который улучшает производительность, проблема в том, что вызывающий может не ожидать такого поведения, особенно в конвейере .
  • Если вы фиксируете вывод в переменной, такой как $surnamearr здесь, PowerShell автоматически собирает отдельные выходные объекты в массив [object[]]; обратите внимание, однако, что выходной объект single возвращается как есть, т.е. не завернутый в массив.

    • Вы можете обернуть @(...) вокруг вызов функции, чтобы вы всегда получали массив
    • В качестве альтернативы, ограничьте тип принимающей переменной: [array] $surnamearr = ..., которая также создает массив [object[]] или что-то вроде [string[]] $surnamearr = ..., который создает строго типизированный массив строк.
0 голосов
/ 05 мая 2020

Если вам нужен только массив фамилий, вы можете сделать это.

$a1 = '[    
    {
        "name": "sachin",
        "surname": "",
    },
    {
        "name": "Rajesh",
        "surname": "Mehta"

    }
]'

$Json = $a1 | ConvertFrom-Json
$Surnames = $Json | 
    Where-Object { $null -ne $_.surname -and ![string]::IsNullOrEmpty($_.surname) } | 
    Select-Object -ExpandProperty surname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...