数组

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

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

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

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

关于数组的关键事实

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

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

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

尝试一下

下载数组示例脚本并将其导入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

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

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

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

函数

说明

count()

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

index(indexValue)

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

indexof(text)

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

size()

返回数组中的元素个数。

split(delimiter)

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