contributors, delete_pages, Interface administrators
4,719
edits
FaeriMagic (talk | contribs) mNo edit summary |
FaeriMagic (talk | contribs) mNo edit summary |
||
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{Documentation subpage|cat=Module documentation subpages}} | |||
{{lua|Module:Exponential search|noprotcat=yes}} | {{lua|Module:Exponential search|noprotcat=yes}} | ||
This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke. | This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke. | ||
Line 12: | Line 13: | ||
== isPositiveInteger == | == isPositiveInteger == | ||
< | <pre> | ||
TableTools.isPositiveInteger(value) | TableTools.isPositiveInteger(value) | ||
</ | </pre> | ||
Returns <code>true</code> if <code>''value''</code> is a positive integer, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table. | Returns <code>true</code> if <code>''value''</code> is a positive integer, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table. | ||
Line 20: | Line 21: | ||
== isNan == | == isNan == | ||
< | <pre> | ||
TableTools.isNan(value) | TableTools.isNan(value) | ||
</ | </pre> | ||
Returns <code>true</code> if <code>''value''</code> is a [[NaN]] value, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.) | Returns <code>true</code> if <code>''value''</code> is a [[NaN]] value, and <code>false</code> if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.) | ||
Line 28: | Line 29: | ||
== shallowClone == | == shallowClone == | ||
< | <pre> | ||
TableTools.shallowClone(t) | TableTools.shallowClone(t) | ||
</ | </pre> | ||
Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use <code>[[mw:Extension:Scribunto/Lua reference manual#mw.clone|mw.clone]]</code> instead. If you want to make a new table with no shared subtables and without metatables transferred, use <code>[[#deepCopy|deepCopy]]</code> with the <code>noMetatable</code> option. | Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use <code>[[mw:Extension:Scribunto/Lua reference manual#mw.clone|mw.clone]]</code> instead. If you want to make a new table with no shared subtables and without metatables transferred, use <code>[[#deepCopy|deepCopy]]</code> with the <code>noMetatable</code> option. | ||
Line 36: | Line 37: | ||
== removeDuplicates == | == removeDuplicates == | ||
< | <pre> | ||
TableTools.removeDuplicates(t) | TableTools.removeDuplicates(t) | ||
</ | </pre> | ||
Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first <code>nil</code> value. (For arrays containing <code>nil</code> values, you can use <code>[[#compressSparseArray|compressSparseArray]]</code> first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {{code|code={5, 4, 4, 3, 4, 2, 2, 1}|lang=lua}} <code>removeDuplicates</code> will return {{code|code={5, 4, 3, 2, 1}|lang=lua}}. | Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first <code>nil</code> value. (For arrays containing <code>nil</code> values, you can use <code>[[#compressSparseArray|compressSparseArray]]</code> first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {{code|code={5, 4, 4, 3, 4, 2, 2, 1}|lang=lua}} <code>removeDuplicates</code> will return {{code|code={5, 4, 3, 2, 1}|lang=lua}}. | ||
Line 44: | Line 45: | ||
== numKeys == | == numKeys == | ||
< | <pre> | ||
TableTools.numKeys(t) | TableTools.numKeys(t) | ||
</ | </pre> | ||
Takes a table <code>''t''</code> and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {{code|code={'foo', nil, 'bar', 'baz', a = 'b'}|lang=lua}}, <code>numKeys</code> will return {{code|code={1, 3, 4}|lang=lua}}. | Takes a table <code>''t''</code> and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {{code|code={'foo', nil, 'bar', 'baz', a = 'b'}|lang=lua}}, <code>numKeys</code> will return {{code|code={1, 3, 4}|lang=lua}}. | ||
Line 52: | Line 53: | ||
== affixNums == | == affixNums == | ||
< | <pre> | ||
TableTools.affixNums(t, prefix, suffix) | TableTools.affixNums(t, prefix, suffix) | ||
</ | </pre> | ||
Takes a table <code>''t''</code> and returns an array containing the numbers of keys with the optional prefix <code>''prefix''</code> and the optional suffix <code>''suffix''</code>. For example, for the table {{code|code={a1 = 'foo', a3 = 'bar', a6 = 'baz'}|lang=lua}} and the prefix <code>'a'</code>, <code>affixNums</code> will return {{code|code={1, 3, 6}|lang=lua}}. All characters in <code>''prefix''</code> and <code>''suffix''</code> are interpreted literally. | Takes a table <code>''t''</code> and returns an array containing the numbers of keys with the optional prefix <code>''prefix''</code> and the optional suffix <code>''suffix''</code>. For example, for the table {{code|code={a1 = 'foo', a3 = 'bar', a6 = 'baz'}|lang=lua}} and the prefix <code>'a'</code>, <code>affixNums</code> will return {{code|code={1, 3, 6}|lang=lua}}. All characters in <code>''prefix''</code> and <code>''suffix''</code> are interpreted literally. | ||
Line 62: | Line 63: | ||
== numData == | == numData == | ||
< | <pre> | ||
TableTools.numData(t, compress) | TableTools.numData(t, compress) | ||
</ | </pre | ||
Given a table with keys like <code>"foo1"</code>, <code>"bar1"</code>, <code>"foo2"</code>, and <code>"baz2"</code>, returns a table of subtables in the format {{code|code={ [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }|lang=lua}}. Keys that don't end with an integer are stored in a subtable named <code>"other"</code>. The compress option compresses the table so that it can be iterated over with <code>ipairs</code>. | Given a table with keys like <code>"foo1"</code>, <code>"bar1"</code>, <code>"foo2"</code>, and <code>"baz2"</code>, returns a table of subtables in the format {{code|code={ [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }|lang=lua}}. Keys that don't end with an integer are stored in a subtable named <code>"other"</code>. The compress option compresses the table so that it can be iterated over with <code>ipairs</code>. | ||
Line 70: | Line 71: | ||
== compressSparseArray == | == compressSparseArray == | ||
< | <pre> | ||
TableTools.compressSparseArray(t) | TableTools.compressSparseArray(t) | ||
</ | </pre> | ||
Takes an array <code>''t''</code> with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with <code>ipairs</code>. Any keys that are not positive integers are removed. For example, for the table {{code|code={1, nil, foo = 'bar', 3, 2}|lang=lua}}, <code>compressSparseArray</code> will return {{code|code={1, 3, 2}|lang=lua}}. | Takes an array <code>''t''</code> with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with <code>ipairs</code>. Any keys that are not positive integers are removed. For example, for the table {{code|code={1, nil, foo = 'bar', 3, 2}|lang=lua}}, <code>compressSparseArray</code> will return {{code|code={1, 3, 2}|lang=lua}}. | ||
Line 80: | Line 81: | ||
== sparseIpairs == | == sparseIpairs == | ||
< | <pre> | ||
TableTools.sparseIpairs(t) | TableTools.sparseIpairs(t) | ||
</ | </pre> | ||
This is an iterator function for traversing a sparse array <code>''t''</code>. It is similar to <code>[[mw:Extension:Scribunto/Lua reference manual#ipairs|ipairs]]</code>, but will continue to iterate until the highest numerical key, whereas <code>ipairs</code> may stop after the first <code>nil</code> value. Any keys that are not positive integers are ignored. | This is an iterator function for traversing a sparse array <code>''t''</code>. It is similar to <code>[[mw:Extension:Scribunto/Lua reference manual#ipairs|ipairs]]</code>, but will continue to iterate until the highest numerical key, whereas <code>ipairs</code> may stop after the first <code>nil</code> value. Any keys that are not positive integers are ignored. | ||
Line 98: | Line 99: | ||
== size == | == size == | ||
< | <pre> | ||
TableTools.size(t) | TableTools.size(t) | ||
</ | </pre> | ||
Finds the size of a key/value pair table ([[associative array]]). For example, for {{code|code={foo = 'foo', bar = 'bar'}|lang=lua}}, <code>size</code> will return <code>2</code>. The function will also work on arrays, but for arrays it is more efficient to use the <code>#</code> operator. Note that to find the size, this function uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function to iterate through all of the keys. | Finds the size of a key/value pair table ([[associative array]]). For example, for {{code|code={foo = 'foo', bar = 'bar'}|lang=lua}}, <code>size</code> will return <code>2</code>. The function will also work on arrays, but for arrays it is more efficient to use the <code>#</code> operator. Note that to find the size, this function uses the <code>[[mw:Extension:Scribunto/Lua reference manual#pairs|pairs]]</code> function to iterate through all of the keys. | ||
Line 114: | Line 115: | ||
== sortedPairs == | == sortedPairs == | ||
< | <pre> | ||
TableTools.sortedPairs(t, keySort) | TableTools.sortedPairs(t, keySort) | ||
</ | </pre> | ||
Iterates through a table, with the keys sorted using the <code>keysToList</code> function. If there are only numerical keys, <code>sparseIpairs</code> is probably more efficient. | Iterates through a table, with the keys sorted using the <code>keysToList</code> function. If there are only numerical keys, <code>sparseIpairs</code> is probably more efficient. | ||
Line 122: | Line 123: | ||
== isArray == | == isArray == | ||
< | <pre> | ||
TableTools.isArray(value) | TableTools.isArray(value) | ||
</ | </pre> | ||
Returns <code>true</code> if <code>''value''</code> is a table and all keys are consecutive integers starting at 1. | Returns <code>true</code> if <code>''value''</code> is a table and all keys are consecutive integers starting at 1. | ||
Line 130: | Line 131: | ||
== isArrayLike == | == isArrayLike == | ||
< | <pre> | ||
TableTools.isArrayLike(value) | TableTools.isArrayLike(value) | ||
</ | </pre> | ||
Returns <code>true</code> if <code>''value''</code> is iterable and all keys are consecutive integers starting at 1. | Returns <code>true</code> if <code>''value''</code> is iterable and all keys are consecutive integers starting at 1. | ||
Line 138: | Line 139: | ||
== invert == | == invert == | ||
< | <pre> | ||
TableTools.invert(arr) | TableTools.invert(arr) | ||
</ | </pre> | ||
Transposes the keys and values in an array. For example, {{code|invert{ "a", "b", "c" }|lua}} yields {{code|code={ a=1, b=2, c=3 }|lang=lua}}. | Transposes the keys and values in an array. For example, {{code|invert{ "a", "b", "c" }|lua}} yields {{code|code={ a=1, b=2, c=3 }|lang=lua}}. | ||
Line 146: | Line 147: | ||
== listToSet == | == listToSet == | ||
< | <pre> | ||
TableTools.listToSet(arr) | TableTools.listToSet(arr) | ||
</ | </pre> | ||
Creates a set from the array part of the table <code>''arr''</code>. Indexing the set by any of the values of the array returns <code>true</code>. For example, {{code|listToSet{ "a", "b", "c" }|lua}} yields {{code|code={ a=true, b=true, c=true }|lang=lua}}. | Creates a set from the array part of the table <code>''arr''</code>. Indexing the set by any of the values of the array returns <code>true</code>. For example, {{code|listToSet{ "a", "b", "c" }|lua}} yields {{code|code={ a=true, b=true, c=true }|lang=lua}}. | ||
Line 154: | Line 155: | ||
== deepCopy == | == deepCopy == | ||
< | <pre> | ||
TableTools.deepCopy(orig, noMetatable, alreadySeen) | TableTools.deepCopy(orig, noMetatable, alreadySeen) | ||
</ | </pre> | ||
Creates a copy of the table <code>''orig''</code>. As with <code>mw.clone</code>, all values that are not functions are duplicated and the identity of tables is preserved. If <code>''noMetatable''</code> is <code>true</code>, then the metatable (if any) is not copied. Can copy tables loaded with <code>mw.loadData</code>. | Creates a copy of the table <code>''orig''</code>. As with <code>mw.clone</code>, all values that are not functions are duplicated and the identity of tables is preserved. If <code>''noMetatable''</code> is <code>true</code>, then the metatable (if any) is not copied. Can copy tables loaded with <code>mw.loadData</code>. | ||
Line 164: | Line 165: | ||
== sparseConcat == | == sparseConcat == | ||
< | <pre> | ||
TableTools.sparseConcat(t, sep, i, j) | TableTools.sparseConcat(t, sep, i, j) | ||
</ | </pre> | ||
Concatenates all values in the table that are indexed by a positive integer, in order. For example, {{code|sparseConcat{ "a", nil, "c", "d" }|lua}} yields {{code|"acd"|lua}} and {{code|sparseConcat{ nil, "b", "c", "d" }|lua}} yields {{code|"bcd"|lua}}. | Concatenates all values in the table that are indexed by a positive integer, in order. For example, {{code|sparseConcat{ "a", nil, "c", "d" }|lua}} yields {{code|"acd"|lua}} and {{code|sparseConcat{ nil, "b", "c", "d" }|lua}} yields {{code|"bcd"|lua}}. | ||
Line 172: | Line 173: | ||
== length == | == length == | ||
< | <pre> | ||
TableTools.length(t, prefix) | TableTools.length(t, prefix) | ||
</ | </pre> | ||
Finds the length of an array or of a quasi-array with keys with an optional <code>''prefix''</code> such as "data1", "data2", etc. It uses an [[exponential search]] algorithm to find the length, so as to use as few table lookups as possible. | Finds the length of an array or of a quasi-array with keys with an optional <code>''prefix''</code> such as "data1", "data2", etc. It uses an [[exponential search]] algorithm to find the length, so as to use as few table lookups as possible. | ||
Line 182: | Line 183: | ||
== inArray == | == inArray == | ||
< | <pre>TableTools.inArray(array, searchElement) | ||
TableTools.inArray(array, searchElement, fromIndex)</ | TableTools.inArray(array, searchElement, fromIndex)</pre> | ||
Returns <code>true</code> if <code>''searchElement''</code> is a member of the array <code>''array''</code>, and <code>false</code> otherwise. Equivalent to the javascript [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes Array.prototype.includes()] function, except fromIndex is 1-indexed instead of zero-indexed. | Returns <code>true</code> if <code>''searchElement''</code> is a member of the array <code>''array''</code>, and <code>false</code> otherwise. Equivalent to the javascript [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes Array.prototype.includes()] function, except fromIndex is 1-indexed instead of zero-indexed. | ||
Line 200: | Line 201: | ||
== merge == | == merge == | ||
< | <pre> | ||
TableTools.merge(...) | TableTools.merge(...) | ||
</ | </pre> | ||
Given the arrays, returns an array containing the elements of each input array in sequence. | Given the arrays, returns an array containing the elements of each input array in sequence. | ||
Line 208: | Line 209: | ||
== extend == | == extend == | ||
< | <pre> | ||
TableTools.extend(arr1, arr2) | TableTools.extend(arr1, arr2) | ||
</ | </pre> | ||
Extends the first array in place by appending all elements from the second array. | Extends the first array in place by appending all elements from the second array. | ||
Line 218: | Line 219: | ||
<includeonly>{{Sandbox other|| | <includeonly>{{Sandbox other|| | ||
<!-- MODULE CATEGORY --> | |||
[[Category:Lua metamodules|TableTools]] | [[Category:Lua metamodules|TableTools]] | ||
}}</includeonly> | }}</includeonly> | ||
<noinclude> | |||
<!-- MODULE DOCUMENTATION CATEGORIES --> | |||
[[Category:Module documentation subpages imported from Wikipedia]] | |||
</noinclude> |