数组的内容通常需要更改,例如在需要从玩家的库存中移除物品时。Luau 提供了用于表格的 内置函数,使这变得更容易。
本文将概述用于表格的预构建函数,如添加和删除,同时描述如何搜索值。
为了应用这些技能,您将创建一个脚本来帮助管理玩家的库存。

向数组添加值
要向数组添加新值,请使用 table.insert(array, valueToInsert)。第二个参数可以是任何值,例如字符串、数字或整个对象,如 Player 或 IntValue。
为了练习,您将创建一个脚本,将玩家物品存储在一个表中,然后添加到其中。由于此示例只是一个脚本,因此可以与任何文件或项目一起使用。将使用输出窗口测试代码。
创建一个名为 playerItems 的空数组。
playerItems = {}通过输入 table.insert() 将库存物品添加到数组中。在括号中,输入 playerItems,要添加的表,然后为每个物品输入一个字符串。插入至少三个值。
playerItems = {}table.insert(playerItems, "药水")table.insert(playerItems, "面包")table.insert(playerItems, "睡袋")print(playerItems)运行项目。在输出中,展开三个点 ... 以查看打印的表。
从数组中删除值
要删除一个值,例如如果玩家使用了某个物品或活动玩家列表中的某人离开游戏,请使用 table.remove()。根据提供的参数,该函数可以删除表的最后一个值,或在特定索引处删除。
删除最后一个值
有时脚本需要删除特定物品。例如,删除玩家库存中的第一个物品,或选择列表中的第一个玩家。要删除数组中的最后一个值,请使用 table.remove(arrayName)。在这种用例中,唯一需要的参数是表本身。
使用上一个示例中的物品数组。然后,要从表中删除最后一个值,在这种情况下是 "睡袋",输入 table.remove(playerItems)
playerItems = {}table.insert(playerItems, "药水")table.insert(playerItems, "面包")table.insert(playerItems, "睡袋")table.remove(playerItems)print(playerItems)运行项目。在输出窗口中,最后一个值 "睡袋" 不应打印。
按索引删除
要在数组的特定位置删除值,在第二个参数中输入要删除的索引,例如 table.remove(arrayName, 1)。
使用相同的表,输入 table.remove()。在参数中,输入表的名称和 1,要删除的值。
playerItems = {}table.insert(playerItems, "药水")table.insert(playerItems, "面包")table.insert(playerItems, "睡袋")table.remove(playerItems, 1)运行项目。检查第一个值 "药水" 是否已被删除。
在数组中搜索值
要查找数组中的特定值,例如获胜玩家的名称,请使用 table.find() 函数。或者,您可以使用 for 循环和 if 语句编写自己的搜索函数。
查找并返回单个值
要在数组中查找值,创建一个名为 findValue() 的函数,该函数遍历数组并在第一次找到匹配值时停止。
一旦找到该值,函数将使用 return 关键字返回该值的索引。通过索引,您可以将其从数组中删除。
复制下面名为 playerItems 的数组。
local playerItems = {"药水","面包","面包","睡袋"}编写一个名为 findValue() 的新函数,带有两个参数:
whichArray - 要搜索的数组。
itemName - 要检查的特定字符串。
local function findValue(whichArray, itemName)end
在 findValue() 中,使用 for 循环检查数组中的任何值是否与 itemName 匹配。如果值匹配,使用关键字 return 返回在 currentIndex 中找到的值。
local function findValue(whichArray, itemName)for currentIndex = 1, #whichArray doif whichArray[currentIndex] == itemName thenreturn currentIndexendendend通过创建一个名为 valueFound 的变量并调用 findValue() 来测试搜索函数。传入要搜索的数组,以及要搜索的值。运行 代码以确认预期输出为索引 2。
local function findValue(whichArray, itemName)for currentIndex = 1, #whichArray doif whichArray[currentIndex] == itemName then--将 currentIndex 的值返回return currentIndexendendendlocal valueFound = findValue(playerItems, "面包")print("该值位于索引 " .. valueFound)
删除一个值
如果使用查找函数找到了一个值,则可以将其删除。使用 if 语句检查是否找到了一个值。
检查 valueFound 中是否有值;如果有,使用 table.remove() 删除该值。
if valueFound thentable.remove(playerItems, valueFound)end使用以下代码打印数组。
for index = 1, #playerItems dolocal itemString = playerItems[index]print("索引 " .. index .. ": " .. itemString)end进行游戏测试,检查第一个 "面包" 值是否已从数组中删除。尝试通过更改 findValue() 中的第二个参数来删除其他值。
请注意,由于此函数仅被调用一次,因此仅删除了第一个实例的 "面包"。接下来的部分将介绍如何查找并删除所有实例。
查找并删除所有特定值
虽然之前的代码只能删除找到的值的第一个实例,但此代码片段将查找并删除数组中的所有出现。例如,如果玩家想在游戏内商店出售所有面包。
使用一个名为 playerItems 的数组,至少包含四个值和一组 重复项。
local playerItems = {"药水","面包","面包","睡袋"}为了遍历数组,创建一个 for 循环,向后 遍历 playerItems,从 #playerItems 开始,到 1 结束,并以 -1 递增。
for index = #playerItems, 1, -1 doend在循环中,使用 if 语句检查 playerItems[index] 中的值是否等于 "面包",如果是,则删除该项。
for index = #playerItems, 1, -1 doif playerItems[index] == "面包" thentable.remove(playerItems, index)endend使用以下代码添加第二个 for 循环以打印数组。
for index = 1, #playerItems dolocal itemString = playerItems[index]print("索引 " .. index .. ": " .. itemString)end运行脚本并检查所有名为 "面包" 的值是否已被删除。
总结
可以从数组中删除或添加值,但在这样做时要小心索引的移动。使用循环遍历表以删除值的所有实例,或仅删除找到的第一个实例。
关键字 return 可用于停止循环,并在需要时发送信息。
下面可以参考脚本的完成版本。
以下项目包含本教程中的所有脚本。下载 这里。
请注意,所有脚本都在 ServerScriptService 中并且 已禁用。要使用脚本,请在其属性中取消选中禁用字段并运行 Studio。