如何编写一个函数来确定它的表参数是否是一个真正的数组?
isArray({1, 2, 4, 8, 16}) -> true
isArray({1, "two", 3, 4, 5}) -> true
isArray({1, [3]="two", [2]=3, 4, 5}) -> true
isArray({1, dictionaryKey = "not an array", 3, 4, 5}) -> false
我看不到任何方法来确定数字键是否是唯一的键。
如何编写一个函数来确定它的表参数是否是一个真正的数组?
isArray({1, 2, 4, 8, 16}) -> true
isArray({1, "two", 3, 4, 5}) -> true
isArray({1, [3]="two", [2]=3, 4, 5}) -> true
isArray({1, dictionaryKey = "not an array", 3, 4, 5}) -> false
我看不到任何方法来确定数字键是否是唯一的键。
编辑:这是一种测试我最近发现的数组的新方法。对于 由 返回的每个元素pairs
,它只是检查其上的第 n 项是否不是nil
。据我所知,这是测试array-ness的最快和最优雅的方法。
local function isArray(t)
local i = 0
for _ in pairs(t) do
i = i + 1
if t[i] == nil then return false end
end
return true
end
ipairs 迭代索引 1..n,其中 n+1 是第一个整数索引,其中 nil 值
对迭代所有键。
如果键的数量多于顺序索引的数量,则它不能是数组。
所以你要做的就是看看里面的元素个数pairs(table)
是否等于里面的元素个数,ipairs(table)
代码可以写成如下:
function isArray(tbl)
local numKeys = 0
for _, _ in pairs(tbl) do
numKeys = numKeys+1
end
local numIndices = 0
for _, _ in ipairs(tbl) do
numIndices = numIndices+1
end
return numKeys == numIndices
end
我对 Lua 很陌生,所以可能有一些内置函数可以将 numKeys 和 numIndices 计算减少为简单的函数调用。
通过“真正的数组”,我想你的意思是一个表,其键只是数字。为此,请检查表中每个键的类型。试试这个 :
function isArray(array)
for k, _ in pairs(array) do
if type(k) ~= "number" then
return false
end
end
return true --Found nothing but numbers !
end
注意:正如@eric 指出的那样,pairs 没有被定义为以特定顺序迭代。因此,这不是有效的答案。
以下内容就足够了;它检查键是否从 1 到结束是连续的:
local function isArray(array)
local n = 1
for k, _ in pairs(array) do
if k ~= n then return false end
n = n + 1
end
return true
end
这是我对此的看法,#array
用于在读取太多键时检测间隙或停止:
function isArray(array)
local count=0
for k,_ in pairs(array) do
count=count+1
if (type(k) ~= "number" or k < 1 or k > #array or count > #array or math.floor(k) ~= k) then
return false
end
end
if count ~= #array then
return false
end
return true
end
我最近为另一个类似的问题编写了这段代码:
---Checks if a table is used as an array. That is: the keys start with one and are sequential numbers
-- @param t table
-- @return nil,error string if t is not a table
-- @return true/false if t is an array/isn't an array
-- NOTE: it returns true for an empty table
function isArray(t)
if type(t)~="table" then return nil,"Argument is not a table! It is: "..type(t) end
--check if all the table keys are numerical and count their number
local count=0
for k,v in pairs(t) do
if type(k)~="number" then return false else count=count+1 end
end
--all keys are numerical. now let's see if they are sequential and start with 1
for i=1,count do
--Hint: the VALUE might be "nil", in that case "not t[i]" isn't enough, that's why we check the type
if not t[i] and type(t[i])~="nil" then return false end
end
return true
end
从 0 迭代到元素的数量,并检查具有计数器索引的所有元素是否存在。如果不是数组,则序列中会丢失一些索引。