Title: Module:TableTools - freem URL Source: https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools Markdown Content: [Jump to content](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#bodyContent) - [x] Main menu Main menu move to sidebar hide Navigation * [Main page](https://freemwiki.com/wiki/Main_Page "Visit the main page [alt-shift-z]") * [Recent changes](https://freemwiki.com/wiki/Special:RecentChanges "A list of recent changes in the wiki [alt-shift-r]") * [Random page](https://freemwiki.com/wiki/Special:Random "Load a random page [alt-shift-x]") * [Help about MediaWiki](https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents) Legal * [Terms](https://freemwiki.com/wiki/Terms_of_Service) * [Privacy Policy](https://freemwiki.com/wiki/Privacy_Policy) * [About](https://freemwiki.com/wiki/About) * [Contact](https://freemwiki.com/wiki/Contact) [![Image 1](https://freemwiki.com/images/freem.svg)**freem**](https://freemwiki.com/wiki/Main_Page) [Search](https://freemwiki.com/wiki/Special:Search "Search freem [alt-shift-f]") Search - [x] Appearance * [Create account](https://freemwiki.com/index.php?title=Special:CreateAccount&returnto=Module%3ATableTools&returntoquery=oldid%3D579576 "You are encouraged to create an account and log in; however, it is not mandatory") * [Log in](https://freemwiki.com/index.php?title=Special:UserLogin&returnto=Module%3ATableTools&returntoquery=oldid%3D579576 "You are encouraged to log in; however, it is not mandatory [alt-shift-o]") - [x] Personal tools * [Create account](https://freemwiki.com/index.php?title=Special:CreateAccount&returnto=Module%3ATableTools&returntoquery=oldid%3D579576 "You are encouraged to create an account and log in; however, it is not mandatory") * [Log in](https://freemwiki.com/index.php?title=Special:UserLogin&returnto=Module%3ATableTools&returntoquery=oldid%3D579576 "You are encouraged to log in; however, it is not mandatory [alt-shift-o]") Pages for logged out editors [learn more](https://freemwiki.com/wiki/Help:Introduction) * [Contributions](https://freemwiki.com/wiki/Special:MyContributions "A list of edits made from this IP address [alt-shift-y]") * [Talk](https://freemwiki.com/wiki/Special:MyTalk "Discussion about edits from this IP address [alt-shift-n]") # Module:TableTools - [x] Add languages * [Module](https://freemwiki.com/wiki/Module:TableTools "View the module page [alt-shift-c]") * [Discussion](https://freemwiki.com/index.php?title=Module_talk:TableTools&action=edit&redlink=1 "Discussion about the content page (page does not exist) [alt-shift-t]") - [x] English * [Read](https://freemwiki.com/wiki/Module:TableTools) * [Edit source](https://freemwiki.com/index.php?title=Module:TableTools&action=edit "Edit the source code of this page [alt-shift-e]") * [View history](https://freemwiki.com/index.php?title=Module:TableTools&action=history "Past revisions of this page [alt-shift-h]") - [x] Tools Tools move to sidebar hide Actions * [Read](https://freemwiki.com/wiki/Module:TableTools) * [Edit source](https://freemwiki.com/index.php?title=Module:TableTools&action=edit "Edit the source code of this page [alt-shift-e]") * [View history](https://freemwiki.com/index.php?title=Module:TableTools&action=history) General * [What links here](https://freemwiki.com/wiki/Special:WhatLinksHere/Module:TableTools "A list of all wiki pages that link here [alt-shift-j]") * [Related changes](https://freemwiki.com/wiki/Special:RecentChangesLinked/Module:TableTools "Recent changes in pages linked from this page [alt-shift-k]") * [Special pages](https://freemwiki.com/wiki/Special:SpecialPages "A list of all special pages [alt-shift-q]") * [Printable version](javascript:print(); "Printable version of this page [alt-shift-p]") * [Permanent link](https://freemwiki.com/index.php?title=Module:TableTools&oldid=579576 "Permanent link to this revision of this page") * [Page information](https://freemwiki.com/index.php?title=Module:TableTools&action=info "More information about this page") Appearance move to sidebar hide From freem Revision as of 06:18, 21 October 2025 by [Lukegao](https://freemwiki.com/index.php?title=User:Lukegao&action=edit&redlink=1 "User:Lukegao (page does not exist)")([talk](https://freemwiki.com/index.php?title=User_talk:Lukegao&action=edit&redlink=1 "User talk:Lukegao (page does not exist)") | [contribs](https://freemwiki.com/wiki/Special:Contributions/Lukegao "Special:Contributions/Lukegao"))(1 revision imported) ([diff](https://freemwiki.com/index.php?title=Module:TableTools&diff=prev&oldid=579576 "Module:TableTools")) [← Older revision](https://freemwiki.com/index.php?title=Module:TableTools&direction=prev&oldid=579576 "Module:TableTools") | Latest revision (diff) | Newer revision → (diff) _Documentation for this module may be created at [Module:TableTools/doc](https://freemwiki.com/index.php?title=Module:TableTools/doc&action=edit&redlink=1 "Module:TableTools/doc (page does not exist)")_ [](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-1)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-2)-- TableTools --[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-3)-- --[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-4)-- This module includes a number of functions for dealing with Lua tables. --[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-5)-- It is a meta-module, meant to be called from other Lua modules, and should not --[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-6)-- be called directly from #invoke. --[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-7)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-8)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-9)local libraryUtil = require('libraryUtil')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-10)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-11)local p = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-12)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-13)-- Define often-used variables and functions.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-14)local floor = math.floor[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-15)local infinity = math.huge[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-16)local checkType = libraryUtil.checkType[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-17)local checkTypeMulti = libraryUtil.checkTypeMulti[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-18)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-19)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-20)-- isPositiveInteger[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-21)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-22)-- This function returns true if the given value is a positive integer, and false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-23)-- if not. Although it doesn't operate on tables, it is included here as it is[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-24)-- useful for determining whether a given table key is in the array part or the[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-25)-- hash part of a table.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-26)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-27)function p.isPositiveInteger(v)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-28)return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-29)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-30)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-31)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-32)-- isNan[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-33)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-34)-- This function returns true if the given number is a NaN value, and false if[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-35)-- not. Although it doesn't operate on tables, it is included here as it is useful[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-36)-- for determining whether a value can be a valid table key. Lua will generate an[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-37)-- error if a NaN is used as a table key.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-38)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-39)function p.isNan(v)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-40)return type(v) == 'number' and v ~= v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-41)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-42)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-43)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-44)-- shallowClone[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-45)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-46)-- This returns a clone of a table. The value returned is a new table, but all[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-47)-- subtables and functions are shared. Metamethods are respected, but the returned[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-48)-- table will have no metatable of its own.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-49)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-50)function p.shallowClone(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-51)checkType('shallowClone', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-52)local ret = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-53)for k, v in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-54)ret[k] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-55)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-56)return ret[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-57)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-58)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-59)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-60)-- removeDuplicates[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-61)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-62)-- This removes duplicate values from an array. Non-positive-integer keys are[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-63)-- ignored. The earliest value is kept, and all subsequent duplicate values are[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-64)-- removed, but otherwise the array order is unchanged.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-65)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-66)function p.removeDuplicates(arr)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-67)checkType('removeDuplicates', 1, arr, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-68)local isNan = p.isNan[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-69)local ret, exists = {}, {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-70)for _, v in ipairs(arr) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-71)if isNan(v) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-72)-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-73)ret[#ret + 1] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-74)elseif not exists[v] then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-75)ret[#ret + 1] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-76)exists[v] = true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-77)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-78)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-79)return ret[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-80)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-81)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-82)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-83)-- numKeys[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-84)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-85)-- This takes a table and returns an array containing the numbers of any numerical[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-86)-- keys that have non-nil values, sorted in numerical order.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-87)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-88)function p.numKeys(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-89)checkType('numKeys', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-90)local isPositiveInteger = p.isPositiveInteger[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-91)local nums = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-92)for k in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-93)if isPositiveInteger(k) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-94)nums[#nums + 1] = k[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-95)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-96)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-97)table.sort(nums)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-98)return nums[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-99)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-100)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-101)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-102)-- affixNums[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-103)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-104)-- This takes a table and returns an array containing the numbers of keys with the[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-105)-- specified prefix and suffix. For example, for the table[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-106)-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-107)-- {1, 3, 6}.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-108)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-109)function p.affixNums(t, prefix, suffix)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-110)checkType('affixNums', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-111)checkType('affixNums', 2, prefix, 'string', true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-112)checkType('affixNums', 3, suffix, 'string', true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-113)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-114)local function cleanPattern(s)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-115)-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-116)return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-117)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-118)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-119)prefix = prefix or ''[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-120)suffix = suffix or ''[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-121)prefix = cleanPattern(prefix)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-122)suffix = cleanPattern(suffix)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-123)local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-124)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-125)local nums = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-126)for k in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-127)if type(k) == 'string' then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-128)local num = mw.ustring.match(k, pattern)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-129)if num then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-130)nums[#nums + 1] = tonumber(num)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-131)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-132)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-133)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-134)table.sort(nums)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-135)return nums[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-136)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-137)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-138)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-139)-- numData[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-140)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-141)-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-142)-- of subtables in the format[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-143)-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-144)-- Keys that don't end with an integer are stored in a subtable named "other". The[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-145)-- compress option compresses the table so that it can be iterated over with[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-146)-- ipairs.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-147)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-148)function p.numData(t, compress)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-149)checkType('numData', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-150)checkType('numData', 2, compress, 'boolean', true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-151)local ret = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-152)for k, v in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-153)local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-154)if num then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-155)num = tonumber(num)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-156)local subtable = ret[num] or {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-157)if prefix == '' then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-158)-- Positional parameters match the blank string; put them at the start of the subtable instead.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-159)prefix = 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-160)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-161)subtable[prefix] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-162)ret[num] = subtable[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-163)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-164)local subtable = ret.other or {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-165)subtable[k] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-166)ret.other = subtable[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-167)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-168)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-169)if compress then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-170)local other = ret.other[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-171)ret = p.compressSparseArray(ret)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-172)ret.other = other[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-173)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-174)return ret[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-175)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-176)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-177)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-178)-- compressSparseArray[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-179)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-180)-- This takes an array with one or more nil values, and removes the nil values[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-181)-- while preserving the order, so that the array can be safely traversed with[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-182)-- ipairs.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-183)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-184)function p.compressSparseArray(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-185)checkType('compressSparseArray', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-186)local ret = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-187)local nums = p.numKeys(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-188)for _, num in ipairs(nums) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-189)ret[#ret + 1] = t[num][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-190)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-191)return ret[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-192)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-193)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-194)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-195)-- sparseIpairs[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-196)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-197)-- This is an iterator for sparse arrays. It can be used like ipairs, but can[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-198)-- handle nil values.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-199)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-200)function p.sparseIpairs(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-201)checkType('sparseIpairs', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-202)local nums = p.numKeys(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-203)local i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-204)local lim = #nums[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-205)return function ()[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-206)i = i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-207)if i <= lim then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-208)local key = nums[i][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-209)return key, t[key][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-210)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-211)return nil, nil[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-212)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-213)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-214)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-215)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-216)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-217)-- size[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-218)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-219)-- This returns the size of a key/value pair table. It will also work on arrays,[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-220)-- but for arrays it is more efficient to use the # operator.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-221)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-222)function p.size(t)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-223)checkType('size', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-224)local i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-225)for _ in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-226)i = i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-227)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-228)return i[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-229)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-230)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-231)local function defaultKeySort(item1, item2)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-232)-- "number" < "string", so numbers will be sorted before strings.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-233)local type1, type2 = type(item1), type(item2)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-234)if type1 ~= type2 then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-235)return type1 < type2[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-236)elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-237)return tostring(item1) < tostring(item2)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-238)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-239)return item1 < item2[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-240)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-241)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-242)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-243)-- keysToList[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-244)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-245)-- Returns an array of the keys in a table, sorted using either a default[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-246)-- comparison function or a custom keySort function.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-247)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-248)function p.keysToList(t, keySort, checked)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-249)if not checked then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-250)checkType('keysToList', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-251)checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-252)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-253)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-254)local arr = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-255)local index = 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-256)for k in pairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-257)arr[index] = k[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-258)index = index + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-259)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-260)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-261)if keySort ~= false then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-262)keySort = type(keySort) == 'function' and keySort or defaultKeySort[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-263)table.sort(arr, keySort)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-264)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-265)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-266)return arr[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-267)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-268)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-269)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-270)-- sortedPairs[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-271)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-272)-- Iterates through a table, with the keys sorted using the keysToList function.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-273)-- If there are only numerical keys, sparseIpairs is probably more efficient.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-274)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-275)function p.sortedPairs(t, keySort)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-276)checkType('sortedPairs', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-277)checkType('sortedPairs', 2, keySort, 'function', true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-278)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-279)local arr = p.keysToList(t, keySort, true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-280)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-281)local i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-282)return function ()[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-283)i = i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-284)local key = arr[i][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-285)if key ~= nil then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-286)return key, t[key][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-287)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-288)return nil, nil[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-289)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-290)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-291)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-292)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-293)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-294)-- isArray[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-295)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-296)-- Returns true if the given value is a table and all keys are consecutive[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-297)-- integers starting at 1.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-298)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-299)function p.isArray(v)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-300)if type(v) ~= 'table' then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-301)return false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-302)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-303)local i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-304)for _ in pairs(v) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-305)i = i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-306)if v[i] == nil then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-307)return false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-308)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-309)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-310)return true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-311)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-312)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-313)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-314)-- isArrayLike[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-315)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-316)-- Returns true if the given value is iterable and all keys are consecutive[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-317)-- integers starting at 1.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-318)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-319)function p.isArrayLike(v)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-320)if not pcall(pairs, v) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-321)return false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-322)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-323)local i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-324)for _ in pairs(v) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-325)i = i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-326)if v[i] == nil then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-327)return false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-328)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-329)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-330)return true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-331)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-332)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-333)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-334)-- invert[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-335)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-336)-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-337)-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-338)-- the index of the last duplicate) and NaN values are ignored.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-339)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-340)function p.invert(arr)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-341)checkType("invert", 1, arr, "table")[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-342)local isNan = p.isNan[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-343)local map = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-344)for i, v in ipairs(arr) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-345)if not isNan(v) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-346)map[v] = i[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-347)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-348)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-349)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-350)return map[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-351)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-352)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-353)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-354)-- listToSet[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-355)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-356)-- Creates a set from the array part of the table. Indexing the set by any of the[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-357)-- values of the array returns true. For example, {"a", "b", "c"} ->[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-358)-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-359)-- never equal to any value (including other NaNs or even themselves).[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-360)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-361)function p.listToSet(arr)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-362)checkType("listToSet", 1, arr, "table")[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-363)local isNan = p.isNan[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-364)local set = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-365)for _, v in ipairs(arr) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-366)if not isNan(v) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-367)set[v] = true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-368)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-369)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-370)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-371)return set[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-372)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-373)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-374)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-375)-- deepCopy[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-376)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-377)-- Recursive deep copy function. Preserves identities of subtables.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-378)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-379)local function _deepCopy(orig, includeMetatable, already_seen)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-380)if type(orig) ~= "table" then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-381)return orig[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-382)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-383)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-384)-- already_seen stores copies of tables indexed by the original table.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-385)local copy = already_seen[orig][](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-386)if copy ~= nil then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-387)return copy[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-388)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-389)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-390)copy = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-391)already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-392)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-393)for orig_key, orig_value in pairs(orig) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-394)copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-395)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-396)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-397)if includeMetatable then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-398)local mt = getmetatable(orig)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-399)if mt ~= nil then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-400)setmetatable(copy, _deepCopy(mt, true, already_seen))[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-401)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-402)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-403)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-404)return copy[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-405)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-406)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-407)function p.deepCopy(orig, noMetatable, already_seen)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-408)checkType("deepCopy", 3, already_seen, "table", true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-409)return _deepCopy(orig, not noMetatable, already_seen or {})[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-410)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-411)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-412)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-413)-- sparseConcat[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-414)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-415)-- Concatenates all values in the table that are indexed by a number, in order.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-416)-- sparseConcat{a, nil, c, d} => "acd"[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-417)-- sparseConcat{nil, b, c, d} => "bcd"[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-418)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-419)function p.sparseConcat(t, sep, i, j)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-420)local arr = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-421)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-422)local arr_i = 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-423)for _, v in p.sparseIpairs(t) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-424)arr_i = arr_i + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-425)arr[arr_i] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-426)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-427)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-428)return table.concat(arr, sep, i, j)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-429)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-430)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-431)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-432)-- length[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-433)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-434)-- Finds the length of an array, or of a quasi-array with keys such as "data1",[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-435)-- "data2", etc., using an exponential search algorithm. It is similar to the[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-436)-- operator #, but may return a different value when there are gaps in the array[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-437)-- portion of the table. Intended to be used on data loaded with mw.loadData. For[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-438)-- other tables, use #.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-439)-- Note: #frame.args in frame object always be set to 0, regardless of the number[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-440)-- of unnamed template parameters, so use this function for frame.args.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-441)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-442)function p.length(t, prefix)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-443)-- requiring module inline so that [[[Module:Exponential search]]](https://freemwiki.com/wiki/Module:Exponential_search "Module:Exponential search") which is[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-444)-- only needed by this one function doesn't get millions of transclusions[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-445)local expSearch = require(["Module:Exponential search"](https://freemwiki.com/wiki/Module:Exponential_search))[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-446)checkType('length', 1, t, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-447)checkType('length', 2, prefix, 'string', true)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-448)return expSearch(function (i)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-449)local key[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-450)if prefix then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-451)key = prefix .. tostring(i)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-452)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-453)key = i[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-454)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-455)return t[key] ~= nil[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-456)end) or 0[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-457)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-458)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-459)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-460)-- inArray[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-461)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-462)-- Returns true if searchElement is a member of the array, and false otherwise.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-463)-- Equivalent to JavaScript array.includes(searchElement) or[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-464)-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-465)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-466)function p.inArray(array, searchElement, fromIndex)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-467)checkType("inArray", 1, array, "table")[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-468)-- if searchElement is nil, error?[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-469)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-470)fromIndex = tonumber(fromIndex)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-471)if fromIndex then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-472)if (fromIndex < 0) then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-473)fromIndex = #array + fromIndex + 1[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-474)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-475)if fromIndex < 1 then fromIndex = 1 end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-476)for _, v in ipairs({unpack(array, fromIndex)}) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-477)if v == searchElement then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-478)return true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-479)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-480)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-481)else[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-482)for _, v in pairs(array) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-483)if v == searchElement then[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-484)return true[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-485)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-486)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-487)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-488)return false[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-489)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-490)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-491)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-492)-- merge[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-493)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-494)-- Given the arrays, returns an array containing the elements of each input array[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-495)-- in sequence.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-496)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-497)function p.merge(...)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-498)local arrays = {...}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-499)local ret = {}[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-500)for i, arr in ipairs(arrays) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-501)checkType('merge', i, arr, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-502)for _, v in ipairs(arr) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-503)ret[#ret + 1] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-504)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-505)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-506)return ret[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-507)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-508)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-509)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-510)-- extend[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-511)--[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-512)-- Extends the first array in place by appending all elements from the second[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-513)-- array.[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-514)------------------------------------------------------------------------------------[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-515)function p.extend(arr1, arr2)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-516)checkType('extend', 1, arr1, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-517)checkType('extend', 2, arr2, 'table')[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-518)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-519)for _, v in ipairs(arr2) do[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-520)arr1[#arr1 + 1] = v[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-521)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-522)end[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-523)[](https://freemwiki.com/index.php?oldid=579576&title=Module%3ATableTools#L-524)return p Retrieved from "[https://freemwiki.com/index.php?title=Module:TableTools&oldid=579576](https://freemwiki.com/index.php?title=Module:TableTools&oldid=579576)" * This page was last edited on 21 October 2025, at 06:18. * Content is available under [Creative Commons Attribution-ShareAlike 4.0](https://creativecommons.org/licenses/by-sa/4.0/) unless otherwise noted. FreemWiki is operated by **FINGERPOWER DIGITAL TECHNOLOGY LLC** (Colorado, Entity ID 20221978727). * [Privacy Policy](https://freemwiki.com/wiki/Privacy_Policy) * [About](https://freemwiki.com/wiki/About) * [Terms of Service](https://freemwiki.com/wiki/Terms_of_Service) * [Mobile view](https://freemwiki.com/index.php?title=Module:TableTools&oldid=579576&mobileaction=toggle_view_mobile)