数组

本帮助页面上的信息同时适用于 StudioDesktop Studio

数组是保存一组值的数据结构。 当您有类似项目的列表时,数组会很有帮助。 例如,区号、电话号码或客户姓名等的列表。

您可以在Studio中使用两种数组:

  • 字符串数组:变量中以竖线分隔的字符串。 它们保存字符串值,可以由字母数字字符组成。
  • 动态数组:存储在动态数据对象中的数组。

如果你有一个列表,其中的数据是关于单个实体的各种不同类型的信息,那么动态数据对象是一个更合适的数据结构。 数据结构帮助页面上提供了数组和对象的比较。

关于数组的关键事实

  • 一个数组必须至少有两个元素。 只有一个元素的数组看起来是一个常规变量。 它仍然是一个数组,您可以将其称为数组。 动态数组也是如此。
  • Studio中,数组索引是从 1 开始的。

  • 一些函数可与数组一起使用,例如index()indexof()

  • 您可以对字符串数组使用任何分隔符。 但是,要进行本机读取,字符串数组必须使用竖线字符作为分隔符。

  • Studio 中数组的最大大小为 6300 万个元素。 超过此数组大小会导致脚本跟踪中的__err变量中出现以下错误数组索引越界。 当前数组索引 ([index]) 超出了允许的最大索引 (63000000)

试试看

下载 数组示例脚本 并将其导入 Studio 中。 此帮助页面中的许多示例可在示例脚本的Snippet操作中使用。 您可以打开“代码片段编辑器”窗口并运行调试器来查看示例。

数组语法摘要

使用以下一种语法创建字符串数组。

使用其索引为每个元素分配一个值:

ASSIGN <var>[<index1>] = "<value1>"

ASSIGN <var>[<index2>] = "<value2>"

ASSIGN <var>[<index3>] = "<value3>"

将所有元素值分配给竖线分隔字符串中的变量:

ASSIGN <var> = "<value1> | <value2> | <value3>"

使用以下语法创建动态数组:

DYNAMIC <object>

ASSIGN <object>.<member>[<index>].<sub-member>= "value"

支持动态数组的附表

要引用字符串数组中的特定元素,请使用以下语法:

<var>[index]

要引用动态数组中的特定元素,请使用以下语法:

ASSIGN <var> = <object>.<member>[<index>].<arrayElement>

元素和索引

数组保存的值称为元素。 脚本会跟踪数组中各元素的顺序。 数组中的每个元素都有一个数字标识符,称为索引号。 索引会根据每个元素在数组中的位置,自动分配给每个元素。 如果重新排列、添加或删除元素,它们的索引可能会发生变化。

Studio中,数组索引是从 1 开始的。 索引必须是正整数。 您需要知道与数组中特定元素进行交互的索引。 如果您不知道,可以使用indexof()函数来确定元素的索引。

请参阅字符串数组的单个元素

引用字符串数组的单个元素时,请使用以下语法:<arrayElement>[<index>]。 您可以在等号的任一侧使用此语法。 例如,您可以使用它给元素分配值或引用元素的值,例如当将值分配给另一个变量时。

例如:

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

在此示例中,Beowulf索引为 1,Sir Gawain的索引为 2,Byrtnoth的索引为 3。 当以竖线分隔格式查看数组时,这些元素具有相同的索引:name = "Beowulf|Sir Gawain|Byrhtnoth"。 要确定此格式数组的索引,请从左到右对元素进行计数,从 1 开始。

索引按数字顺序进行填充

索引按数字顺序逐一进行填充。 如果您引用数组中当前不存在的索引,脚本将创建该索引;在没有给它赋值的情况下,该索引将为空。 该脚本会创建(在所引用索引与数组中上一个元素之间)不存在的任何索引。 脚本为填充索引而添加的元素为空。 例如:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth" 
ASSIGN heroes[6] = "Lancelot"

生成的数组是heroes = "Beowulf|Sir Gawain|Byrhtnoth|||Lancelot"。 脚本为索引 4 和 5 添加了元素,但由于没有给它们分配值,因此它们为空。

同样,如果您尝试从不存在的元素中提取值,则会创建该元素。 您尝试引用的元素和上一个元素之间的所有元素,也会被创建,并且将为空。

如果在需要数字的上下文中引用了空数组元素,则脚本的运行方式就像该值为零一样。

确定下一个未使用的索引

为了避免在数组中创建不必要的空元素,您可以确定下一个未使用的索引。 您必须对数组中的元素进行计数,然后在该数字上加 1。 这将为您提供下一个打开的索引号。

为此,请使用size()函数。 例如:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"  
ASSIGN nextIndex = heroes.size() + 1
ASSIGN heroes[nextIndex] = Roland

在本示例中,heroes.size()返回名称数组中的元素数量。 totalNames的值为3。 通过向其添加 1 并使用nextIndex变量代替索引号,可以向数组添加一个元素。

您还可以使用count()函数。

字符串数组

字符串数组可以通过两种方式来定义。 第一个是单独显式命名每个元素。 以下示例显示了一个字符串数组,其中包含逐个元素定义的文本值。

ASSIGN heroes[1] = "Beowulf"
ASSIGN heroes[2] = "Sir Gawain" 
ASSIGN heroes[3] = "Byrhtnoth"

数组名后面方括号中的数字是元素的索引号。 这是每个元素的标识符。

定义字符串数组的第二种方法是使用竖线分隔字符串,在每个元素之间使用单个竖线字符 (|)。 此示例显示第一个示例中定义为竖线分隔字符串的数组。 创建以竖线分隔的字符串数组时,语句右侧的值必须用双引号引起来。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"

这些函数之间没有区别,可以互换使用。 这两种定义字符串数组的方法会产生相同的结果,即包含元素数组的变量。

声明字符串数组时不需要使用 ASSIGN 关键字。 不过,使用该关键字还是很有帮助的。 包含ASSIGN使脚本中引入数组的位置易于使用高级搜索找到。 如果没有ASSIGN,则必须搜索数组的名称。 搜索结果将包含对脚本中数组的每个引用。 如果在搜索词中包含 ASSIGN,搜索将只返回明确分配变量的结果。 要声明一个不含 ASSIGN 的变量,请使用以下语法:<name> = "<value>"

动态数组

动态数组可以采用多种形式:

  • 动态数据对象包含一个数组。 每个数组元素也是一个对象成员。

    DYNAMIC beowulfLocations 
    ASSIGN beowulfLocations[1] = "Land of the Geats"
    ASSIGN beowulfLocations[2] = "Heorot" 
    ASSIGN beowulfLocations[3] = "Earnanæs"
  • 动态对象包含一个保存数组的成员。 对象的其他成员可以保存字符串或数值,也可以是其他数组。

    DYNAMIC beowulfCharacteristics 
    ASSIGN beowulfCharacteristics.foe[1].characteristics[1] = "Grendel"
    ASSIGN beowulfCharacteristics.foe[1].characteristics[2] = "son of Cain"
    ASSIGN beowulfCharacteristics.foe[2] = $"Grendel\'s mother" 
    ASSIGN beowulfCharacteristics.foe[3] = "Dragon"
  • 字符串数组保存多个元素,每个元素都包含一个动态数据对象。

    DYNAMIC epicPoems
    ASSIGN epicPoems.poemName = "Beowulf"
    DYNAMIC heroes 
    ASSIGN heroes.heroName = "Beowulf"
    DYNAMIC monsters
    ASSIGN monsters.monsterName = "Grendel"
    ASSIGN oldEnglish[1] = epicPoems
    ASSIGN oldEnglish[2] = heroes
    ASSIGN oldEnglish[3] = monsters

    使用代码片段调试器时,您可以查看动态对象和字符串数组的内容

    需要脚本与其他系统配合使用时,例如连接到API,不能使用这种类型的动态数组。 字符串数组保存的数据无法序列化,也不能转换为 JSON 或 XML 字符串。

按位置引用数组元素

您可以使用字符串或动态数组中的元素在数组中的位置(由其索引指定)来引用该元素。 例如:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN currentName = heroes[2]

currentName的值为Sir Gawain

您可以使用变量来代替ASSIGN语句中等号任一侧的索引号。 这允许您不用在脚本中对索引进行硬编码的情况下,引用特定索引。 例如:

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN location = 2
ASSIGN currentHero = heroes[location]
ASSIGN nextIndex = heroes.count() + 1
ASSIGN heroes[nextIndex] = "Roland"

本示例中currentHero的值是 Sir Gawain。 上例的最后两行显示使用变量作为ASSIGN语句左侧的索引。 它还演示了如何使用count()函数返回数组中的元素数量。 此信息用于在下一个空索引中添加新元素。

当您使用变量作为索引号时,不需要在变量名称两边使用大括号。 该脚本需要数组名称中方括号之间的数值。 它假定任何非数字的东西都是变量,所以它会寻找一个同名的变量。 必须有一个相应的变量声明,您可以在其中分配数值。 如果没有,则会导致以下错误:

_ERR=在代码片段第 12 行中:数组索引必须 >= 1

如果Snippet 操作的Error分支已连接,则当发生此错误时脚本将采用它。

将 FOREACH 与字符串数组一起使用

您可以使用带有字符串数组的FOREACH语句来迭代每个元素。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
 FOREACH elem IN heroes 
{
   ASSIGN aName = elem 
}

在本示例中,elemaName每次迭代都会更新。 elem变量保存FOREACH循环正在处理的当前元素。 该脚本使用elem的内容来更新aName。 每次迭代结束时,elemaName保存相同的值,但在迭代中间,elem会保存新值,而aName保存旧值(或者在第一次迭代开始时没有保存值)。

您可以在 FOREACH Loop with a String Array 数组示例脚本数组示例脚本中的 代码片段中清楚地看到这一点。 要查看变量的更新方式,请逐行执行逐行执行

将 FOR 与字符串数组一起使用

您可以使用带有字符串数组的FOR循环来迭代数组,并以设定的次数执行已定义的操作。

ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth|Lancelot"
FOR i = 1 TO heroes.count 
   {    
      item = "{heroes[i]}" 
   } 
        

本示例的结果是,ItemFOR循环的每次迭代时,在i值指定的索引位置处,用heroes数组的内容进行更新。 FOR循环在到达字符串数组的末尾后停止迭代,如heroes.count所示。

您可以在数组示例脚本FOR Loop with a String Array代码片段中看到此循环。

将函数与数组一起使用

您可以将函数与数组一起使用。 使用方括号中带有索引的数组名称,再使用点表示法添加函数名称。 如下例所示:


ASSIGN heroes = "Beowulf|Sir Gawain|Byrhtnoth"
ASSIGN miniHero = "{heroes[2].lower}"
ASSIGN yellyHero = "{heroes[2].upper}"

此示例的结果是miniHero = sir gawainyellyHero = SIR GAWAIN

并非所有函数都适用于所有数组。 有些仅适用于某些类型的值。 验证您要用的函数所适用的类型。

您可以将函数与动态数组一起使用。 但是,根据具体的动态数组及其包含的内容,您可能需要使用特殊的对象属性。.$value 有些函数不能作用于整个对象。 例如,您不能对对象数组使用lower()函数。 如果您尝试这样做,脚本将忽略该函数。 在这些情况下,您必须应用变通方法。 例如,您可以将数组中对象的特定值复制到单独的变量中。 然后,可以对变量的内容使用lower(),并根据需要将转换后的值复制回对象中。

下表中的函数是专门设计用于处理数组的。 您可以在 Functions and Arrays 代码片段中测试这些函数,该代码片段位于 数组示例脚本 中。

函数

说明

count()

返回数组或对象中的元素个数。

index(indexValue)

根据指定的 indexValue 从变量的内容返回数组元素。

indexof(text)

返回指定的 text 在变量内容中的字符位置。

size()

返回数组中的元素个数。

split(delimiter)

将变量内容转换为以竖线分隔的字符串,该字符串可作为数组处理。 以竖线分隔字符替换指定的现有 delimiter