Тип данни за нетипизиран обект
Нетипизираният обект е тип Power Fx данни, който може да съдържа всяка структура от данни, сложна или проста. Не може да се използва директно и изисква изрично преобразуване в тип данни. Полетата в записите в нетипизиран обект могат да бъдат достъпни с помощта на нотация с точки и съществуването на полета се проверява само по време на изпълнение.
Нетипизираният обект е връщаният тип на конкретни нетипизирани доставчици. Понастоящем само функцията ParseJSON() връща нетипизиран обект.
Обикновени типове
Стойността на променлива от тип нетипизиран обект не може да се използва директно. Винаги трябва да го въвеждате правилно, като използвате съответния конструктор на типове.
Следващите примери преобразуват стойността на нетипизиран обект променлива с име UOValue
.
Text(UOValue)
Value(UOValue)
Следващата таблица изброява типовете данни и съответните функции за преобразуване на нетипизиран обект в този тип данни.
Тип данни | Function | Описание |
---|---|---|
Boolean | Булева стойност() | При преобразуване на нетипизиран обект в булев стойност, основната стойност трябва да представлява булев или тип, който може да бъде автоматично преобразуван (като например низ "true"). |
Цвят | ColorValue() или RGBA() | Цветовете могат да бъдат представени в нотация за дефиниране на цвят с каскаден стилов лист (CSS) като низ или като отделни RGBA компоненти. Нетипизираният обект може да бъде преобразуван директно от низ за дефиниране на цвят в каскаден стилов лист (CSS), като се използва ColorValue() функция или от отделни RGBA числа в цвят с помощта на RGBA() функция. |
Валута, число | Стойност() | Когато преобразувате нетипизиран обект в число, базовата стойност трябва да представлява число или тип, който може да бъде автоматично преобразуван (като например низ "123.456"). |
Дата, Дата и час, Час | DateValue(), TimeValue() или DateTimeValue() | Дата, час и дата и час могат директно да бъдат конвертирани от нетипизиран обект в съответния им тип, когато са представени във формат ISO 8601. Други формати трябва първо да бъдат преобразувани в текст с помощта на Text() функцията и след това предадени в DateValue(), TimeValue() или DateTimeValue( ) функция, която по подразбиране ще използва езика на настройките на текущия потребител, за да интерпретира датата и часа. |
GUID | GUID() | Нетипизиран обект може да бъде директно преобразуван в GUID, ако основният обект представлява GUID или ако представлява низ. |
Хипервръзка, изображение и медия | Текст() | Тези типове данни са текстови типове данни и могат да бъдат преобразувани в текст и след това използвани в Power Fx. |
Избор, два варианта | Switch() или If() | Изборите и две опции са представени като локализирани низове в Power Fx. Изборът е подкрепен от число и две опции като булеви стойности. Няма директно преобразуване от булева стойност, число или низ към избор или две опции, но Switch() или If() функциите могат да се използват за булева, текстова или числова стойност за правилно присвояване на избор или две опции стойност. |
Запис | няма | Няма директно преобразуване от нетипизиран обект към структура на запис, но отделни полета могат да бъдат извлечени от нетипизиран обект за създаване на нов запис. |
Справка за запис | няма | Препратките към записи са уникални за източниците на данни и нямат значимо представяне в нетипизирани обекти. |
Table | Table() и ForAll() | Един нетипизиран обект може да представлява масив, който може да бъде преобразуван в таблица. Тези обекти могат да бъдат масиви от записи или масиви от стойности, които на практика са таблици с една колона. ForAll() може да се използва за създаване на таблица с напълно въведени записи. Прегледайте примерите по-надолу в тази статия за повече информация. |
Текстово съобщение | Текст() | Текстът може директно да се конвертира. Ако нетипизиран обект представлява число, първо трябва да преобразувате нетипизирания обект в число, като използвате Value() преди конвертиране в текст. |
Типове на записа
Можете да получите достъп до полета на променлива, представляваща нетипизиран обект запис, като използвате обикновена нотация с точка, използвана за записи. Съществуването на полетата обаче няма да бъде проверено до време на изпълнение. В резултат на това също няма наличен intellisense. Ако дадено поле не съществува или има основна нулева стойност, достъпът до него ще доведе до стойност Blank().
Всяко поле в записа също е от тип нетипизиран обект и трябва да бъде правилно въведено. Полето може да бъде нетипизиран запис от прост тип. В случай, че е запис, можете да оковите точковата нотация. Ако някое поле във веригата не съществува, се връща Blank().
Следващите примери използват полета от нетипирана обектна променлива с име UORecord
.
Text(UORecord.StringField)
Value(UORecord.Field.ChildField)
В случай че име на поле се състои от невалидно име на идентификатор, например когато имената на полетата започват с число или съдържат невалидни знаци като тире, можете да поставите имената на полетата в единични кавички:
untyped.'01'
untyped.'my-field'
Динамичен достъп до колони
Понякога имената на колоните в записа ще бъдат динамични. Използвайте функцията ColumnNames , за да определите кои имена на колони са налични в даден запис, и след това използвайте функцията Column , за да извлечете стойността на именувана колона.
Например:
LettersUsed = ParseJSON( "{ ""d"": 2, ""p"": 3 }" );
Concat( ColumnNames( LettersUsed ) As Names, Names.Value, ", " )
// returns "d, p"
Sum( ForAll( ColumnNames( LettersUsed ) As Names, Column( LettersUsed, Names.Value ) ), Value )
// returns 5
Масиви
Променлива на нетипизиран обект може да съдържа масив. Въпреки че масивът може да бъде или масив от записи, или масив от прости типове, преобразуването на нетипизирания обект масив в таблица с помощта на Table() функцията винаги ще води до таблица с една колона от нетипизирани обекти. Функции като ForAll() и Index() не изискват първо създаване на Table() и в резултат на това не изискват използване на полето с една колона Value
,
Например, за да получите второто число в масив от нетипизиран обект съдържащ числови стойности ([1, 2, 3]
), може да се използва следната формула за извличане на втори ред в таблицата и преобразувайте колона в число:
Value( Index( UOArray, 2 ) )
Ако нетипизираният обект е бил преобразуван в Table() първо, вторият ред в резултата с една колона таблицата е колона Value
, съдържаща нетипизиран обект:
Value( Index( Table( UOArray ), 2 ).Value )
За масив от записи, които имат текстова колона, наречена Field
, се прилага същата логика.
Нетипизирания обект може да бъде достъпен директно или ако използването на Table() функцията ще доведе до един- таблица с колони на нетипизиран обект.
Достъпът до колоната Field
може да се осъществи директно от нетипизирания обект, върнат от функцията Index().
Text( Index( UORecordArray, 2 ).Field )
Когато използвате функцията Table(), първо извлечете колоната с една колона Value
, за да получите нетипизирания обект, след което влезте в колоната Field
:
Text( Index( Table( UORecordArray ), 2 ).Value.Field )
За да конвертирате масив от записи във въведена таблица, можете да използвате функцията ForAll() и да конвертирате всяко отделно поле.
ForAll( UORecordArray, { FirstField: Value(ThisRecord.FirstField), SecondField: Text(ThisRecord.SecondField) } )
Ако нетипизиран обект първо се преобразува в таблица, отново получената таблица с една колона на нетипизиран обект ще изисква да използвате колоната Value
за получаване на полетата.
ForAll( Table(UORecordArray), { FirstField: Value(ThisRecord.Value.FirstField), SecondField: Text(ThisRecord.Value.SecondField) } )
Преобразуване в въведени записи и таблици
Вместо да преобразувате всяка проста стойност поотделно, функциите ParseJSON, IsType и AsType могат да се използват за групово преобразуване на нетипизиран обект в типизиран обект. Използвайте функцията Тип , за да създадете тип, който ще съпостави нетипизираната структура с типизирана структура.
Например, тук интерпретираме JSON низовете като стойности за дата и час, без да е необходимо да извикваме функцията DateTimeValue:
Eclipse = ParseJSON( "{ ""Start"": ""2026-08-12T18:26:00.000Z"", ""End"": ""2026-08-12T18:33:00.000Z"" }",
Type( { Start: DateTime, End: DateTime } ) );
DateDiff( Eclipse.Start, Eclipse.End, TimeUnit.Minutes )
// 7