$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 = ...
, который создает строго типизированный массив строк.