陣列的內容經常需要被更改,例如當需要從玩家的物品清單中移除一個項目時。Luau 提供了 內建函數 用於表格,使這個過程更簡單。
本文將概述針對表格的預建函數,如添加和刪除,同時描述如何搜索某個值。
為了應用這些技能,您將創建一個腳本,幫助管理玩家的物品清單。

向陣列添加值
要向陣列中添加新值,使用 table.insert(array, valueToInsert)。第二個參數可以是任何值,例如字符串、數字或整個對象,如 Player 或 IntValue。
為了練習,您將創建一個腳本,將玩家物品存儲在一個表中,然後添加到其中。由於這個示例只是腳本,它可以與任何文件或項目一起使用。測試代碼將在输出窗口中進行。
創建一個名為 playerItems 的空陣列。
playerItems = {}通過輸入 table.insert() 將物品添加到陣列中。在括號中,輸入 playerItems,要添加的表,然後為每個項目輸入字符串。至少插入三個值。
playerItems = {}table.insert(playerItems, "藥水")table.insert(playerItems, "麵包")table.insert(playerItems, "睡袋")print(playerItems)執行項目。在 Output 中,展開三個點 ... 以查看打印的表。
從陣列中移除值
要移除某個值,例如如果玩家使用了一個物品或在活躍玩家列表中的某個人離開了遊戲,使用 table.remove()。根據提供的參數,該函數可以刪除表中的最後一個值,或者特定索引處的值。
移除最後一個值
有時腳本需要刪除特定的項目。例如,刪除玩家物品清單中的第一個項目,或選擇列表中的第一個玩家。要移除陣列中的最後一個值,使用 table.remove(arrayName)。在這種用例中,唯一需要的參數是表本身。
使用前面示例中的物品陣列。然後,為了從表中移除最後一個值,在這種情況下是 "睡袋",輸入 table.remove(playerItems)
playerItems = {}table.insert(playerItems, "藥水")table.insert(playerItems, "麵包")table.insert(playerItems, "睡袋")table.remove(playerItems)print(playerItems)執行項目。在 Output 窗口中,最後一個值 "睡袋" 應該不會打印。
按索引移除
要在陣列中的特定點上移除一個值,第二個參數輸入要移除的索引,例如 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 中。
檢查 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 = {"藥水","麵包","麵包","睡袋"}要遍歷該陣列,創建一個向後遍歷 playerItems 的 for 循環,從 #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。