分享方式:


非類型化物件資料類型

非類型化物件是一種數據類型 Power Fx ,可以保存任何數據結構,無論是複雜型還是簡單型。 它不能直接使用,也不需要明確轉換為資料類型。 使用點標記法可存取非類型化物件記錄中的欄位,且只有在執行時才會驗證欄位是否存在。

非類型化物件是特定無類型提供程式的返回類型。 目前只有 ParseJSON() 函數會傳回非類型化物件

簡單類型

非類型化物件類型的變數值不能直接使用。 您必須使用對應的類型建構函式,才能正確地輸入它。

下列範例會轉換名為 UOValue非類型化物件變數值。

Text(UOValue)
Value(UOValue)

下表列出了將非類型化物件轉換為該資料類型的資料類型和相應的函數。

資料類型 函數 名描述
布林值 布林值() 非類型化物件轉換為布林值時,基礎值必須表示布林值或一個可自動轉換的類型 (例如字串 "true")。
Color ColorValue()或 RGBA() 顏色可以在階層式樣式表 (CSS) 顏色定義標記法中表示為字串或單個 RGBA 元件。 非類型化物件可以使用 ColorValue() 函數直接從階層式樣式表 (CSS) 顏色定義字串轉換,或使用 RGBA() 函數從單個 RGBA 數字轉換為顏色。
貨幣、數字 值() 非類型化物件轉換為數字時,基礎值必須表示數字或一個可自動轉換的類型 (例如字串 "123.456")。
日期、日期時間、時間 DateValue()、TimeValue()或 DateTimeValue() 當以以 ISO 8601 格式表示時,日期、時間和日期時間可以直接從非類型化物件轉換為其各自的類型。 其他格式必須先使用 Text() 函數將 JSON 欄位轉換成文字,然後傳遞至 DateValue(), TimeValue() or DateTimeValue() 函數,預設會使用目前使用者設定的語言來解譯日期和時間。
GUID GUID() 如果基礎物件表示 GUID 或表示字串,則可以將非類型化物件直接轉換為 GUID。
超連結、影像和媒體 文字() 這些資料類型是文字資料類型,可以轉換成文字,然後在 Power Fx 中使用。
選擇、兩個選項 Switch()或 If() Choices 和 two options 以當地語系化字串的形式顯示 Power Fx。 選項 由一個數位和 兩個選項 作為布爾值支援。 無法直接從布林值、數字或字串轉換成選擇兩個選項,但可將 Switch()If() 函數用於布林值、文字或數字值,以正確指派選擇兩個選項值。
錄製 n/a 無法從非類型化物件直接轉換成記錄結構,但是可以從非類型化物件擷取個別欄位以建立新記錄。
記錄參考 n/a 記錄參考對資料來源來說是唯一的,且在非類型化物件中沒有有意義的表示。
資料表 Table()ForAll() 非類型化物件可以表示一個陣列,可將其轉換為資料表。 這些物件可以是記錄陣列,或是有效單一資料行資料表的值陣列。 ForAll() 可用於創建具有完全類型化記錄的表。 如需詳細資訊,請參閱此文章中的範例。
文字 文字() 文字可以直接轉換。 如果非類型化物件代表數字,則需要先使用 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() 函數,將會產生非類型化物件的單一資料行資料表。

您可以直接從 Index() 函數所傳回的非類型化物件存取 Field 資料行。

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) } )