Тип даних нетипізованого об’єкта

Нетипізований об’єкт – це тип даних у Power Fx, який може містити будь-яку структуру даних, складну чи просту. Його не можна використовувати безпосередньо, і він потребує явного перетворення на тип даних. Доступ до полів у записах у нетипізованому об’єкті можна отримати за допомогою точкової нотації, а наявність полів перевіряється лише в середовищі виконання.

Нетипізований об’єкт є типом повернення певних нетипізованих постачальників. Наразі лише функція ParseJSON() повертає нетипізований об’єкт.

Прості типи

Значення змінної типу нетипізований об’єкт не можна використовувати безпосередньо. Ви завжди повинні правильно його типізувати, використовуючи відповідний конструктор типів.

У наведених нижче прикладах перетворюється значення змінної нетипізований об’єкт з іменем UOValue.

Text(UOValue)
Value(UOValue)

У наведеній нижче таблиці перелічені типи даних і відповідні функції для перетворення нетипізованого об’єкта в цей тип даних.

Тип даних Function Опис
Boolean Boolean() При перетворенні нетипізованого об’єкта в булеве значення, базове значення має представляти логічне значення або тип, який може бути автоматично перетворений (наприклад, рядок "true").
Колір ColorValue() або RGBA() Кольори можуть бути представлені в нотації визначення кольорів каскадної таблиці стилів (CSS) у вигляді рядка або окремих компонентів RGBA. Нетипізований об’єкт може бути перетворений безпосередньо з рядка визначення кольору каскадної таблиці стилів (CSS) за допомогою функції ColorValue() або з окремих чисел RGBA у колір за допомогою функції RGBA().
Грошова одиниця, номер Value() При перетворенні нетипізованого об’єкта в число, базове значення має представляти число або тип, який може бути автоматично перетворений (наприклад, рядок "123.456").
Дата, дата/час, час DateValue(), TimeValue() or DateTimeValue() Дата, час і дата й час можуть бути безпосередньо перетворені з нетипізованого об’єкту в їх відповідний тип, якщо вони представлені у форматі ISO 8601. Інші формати спочатку необхідно перетворити на текст за допомогою функції Text(), а потім перенести у функцію DateValue(), TimeValue() або DateTimeValue(), яка за замовчуванням використовуватиме мову параметрів поточного користувача для інтерпретації дати й часу.
GUID GUID() Нетипізований об’єкт може бути безпосередньо перетворений на GUID, якщо базовий об’єкт представляє GUID або якщо він представляє рядок.
Гіперпосилання, зображення, медіафайли Text() Ці типи даних є текстовими типами даних, і їх можна перетворити на текст, а потім використовувати в Power Fx.
Вибір, два варіанти Switch() або If() Варіанти вибору та два варіанти представлені у вигляді локалізованих рядків у Power Fx. Варіанти вибору з номером і двома варіантами в якості логічних значень. Не існує прямого перетворення з логічного значення, числа або рядка у вибір або два варіанти, але функції Switch() або If() можуть використовуватися для логічного, текстового або числового значень, щоб правильно призначати значення вибір або два варіанти.
Записати н/д Не існує прямого перетворення з нетипізованого об’єкта в структуру запису, але окремі поля можна получити з нетипізованого об’єкта для створення нового запису.
Посилання на запис н/д Посилання на записи унікальні для джерел даних і не мають змістовного представлення в нетипізованих об’єктах.
Table Table() і ForAll() Нетипізований об’єкт може бути масивом, який можна перетворити на таблицю. Ці об’єкти можуть бути масивами записів або масивами значень, які за суттю є таблицями з одним стовпцем. ForAll() можна використовувати для створення таблиці із повністю типізованими записами. Додаткові відомості див. в прикладах, наведених далі в цій статті.
SMS Text() Текст можна перетворити безпосередньо. Якщо нетипізований об’єкт представляє число, спочатку необхідно перетворити нетипізований об’єкт на число, використовуючи Value() до перетворення на текст.

Типи запису

Ви можете отримати доступ до полів змінної, що представляє запис нетипізований об’єкт, за допомогою звичайної точкової нотації, яка використовується для записів. Однак існування полів не буде перевірено до середовища виконання. У результаті немає доступного intellisense. Якщо поле не існує або має базове значення null, доступ до нього приведе до значення Blank().

Кожне поле запису також має тип нетипізований об’єкт і має бути правильно типізовано. Поле може бути нетипізованим записом простого типу. Якщо це запис, можна сформувати ланцюжок із точковою нотацією. Якщо певне поле в ланцюжку не існує, повертається значення Blank().

У наведених нижче прикладах використовуються поля зі змінної нетипізований об’єкт з іменем UORecord.

Text(UORecord.StringField)
Value(UORecord.Field.ChildField)

Якщо ім’я поля складається з неприпустимого імені ідентифікатора (наприклад, імена полів починаються з цифри або містять неприпустимі символи, як-от дефіс), імена полів можна помістити в одинарні лапки.

untyped.'01'
untyped.'my-field'

Масиви

Змінна нетипізований об’єкт може містити масив. Незважаючи на те, що масив може бути масивом записів, або масивом простих типів, перетворення масиву нетипізованого об’єкта в таблицю за допомогою функції 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) } )