非类型化对象数据类型(试验)

重要提示

非类型化对象是 Power Fx 中的一种数据类型,可以保留任何复杂或简单的数据结构。 它不能直接使用,需要显式转换为数据类型。 非类型化对象中记录中的字段可以使用点表示法访问,字段的存在仅在运行时验证。

非类型化对象是特定非类型化提供程序的返回类型。 目前,只有 ParseJSON() 函数返回非类型化对象

简单类型

非类型化对象类型的变量的值不能直接使用。 您始终必须使用相应的类型构造函数正确键入它。

以下示例转换名为 UOValue非类型化对象变量的值。

Text(UOValue)
Value(UOValue)

下表列出了用于将非类型化对象转换为该数据类型的数据类型和相应函数。

数据类型 函数 说明
布尔型 Boolean() 非类型化对象转换为布尔值时,如果非类型化对象表示这些类型的布尔值,值可能需要先转换为文本数字
Color ColorValue() 或 RGBA() 颜色可以在级联样式表 (CSS) 颜色定义表示法中表示为字符串,或表示为单独的 RGBA 组件。 非类型化对象可以使用 ColorValue() 函数直接从级联样式表 (CSS) 颜色定义字符串转换,或使用 RGBA() 函数从单个 RGBA 数字转换为颜色。
货币、数字 Value() 非类型化对象中的数字可以直接转换为数字。 但是,如果原始非类型化对象值表示为文本,例如,ParseJSON("""123"""),则必须先将其转换为文本,然后再转换为数字。
日期、日期/时间、时间 DateValue()、TimeValue() 或 DateTimeValue() 当以 ISO 8601 格式表示时,日期、时间和日期/时间可以直接从非类型化对象转换为它们各自的类型。 其他格式必须首先使用 Text() 函数转换为文本,然后传递到默认将使用当前用户设置的语言解释日期和时间的 DateValue()、TimeValue() 或 DateTimeValue() 函数。
GUID GUID() 非类型化对象可以直接转换为 GUID。
超链接、图像和媒体 Text() 这些数据类型是文本数据类型,可以转换为文本,然后在 Power Fx 中使用。
选择项、双选项 Switch() 或 If() 选择项双选项在 Power Fx 中显示为本地化字符串。 选择项使用数字和双选项以布尔值形式作为后备。 没有从布尔值、数字或字符串到选择项双选项的直接转换,但 Switch()If() 函数可用于布尔值、文本或数字值,以正确分配选择项双选项值。
记录 没有从非类型化对象到记录结构的直接转换,但可以从非类型化对象检索各个字段来创建新记录。
记录引用 记录引用是数据源独有的,在非类型化对象中没有有意义的表示。
Table()ForAll() 非类型化对象可以表示一个数组,可以转换为表。 这些对象可以是记录数组,也可以是实际上是单列表的值数组。 ForAll() 可用于创建具有完全类型化记录的表。 查看本文后面的示例了解更多信息。
文本 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) } )