返回 Lua table 中值的索引
Returning the index of a value in a Lua table
我在 lua 中有这个 table:
local values={"a", "b", "c"}
如果变量等于 table 条目之一,是否有办法 return table 的索引?
说
local onevalue = "a"
如何在不迭代所有值的情况下获取 "a" 的索引或 table 中的一个值?
没有迭代就无法做到这一点。
如果您发现自己需要经常这样做,请考虑构建一个反向索引:
local index={}
for k,v in pairs(values) do
index[v]=k
end
return index["a"]
如果使用Lua进行Roblox开发,可以使用table.find
方法:
print(table.find({'a', 'b', 'c'}, 'b'))
接受的答案有效,但还有改进的余地:
- 为什么找到元素后不退出循环?为什么要将整个源 table 复制到一个新的一次性 table 中?
- 通常,这种函数 returns first 具有该值的数组索引,而不是 arbitrary 数组索引该值。
对于数组:
-- Return the first index with the given value (or nil if not found).
function indexOf(array, value)
for i, v in ipairs(array) do
if v == value then
return i
end
end
return nil
end
print(indexOf({'b', 'a', 'a'}, 'a')) -- 2
对于哈希 tables:
-- Return a key with the given value (or nil if not found). If there are
-- multiple keys with that value, the particular key returned is arbitrary.
function keyOf(tbl, value)
for k, v in pairs(tbl) do
if v == value then
return k
end
end
return nil
end
print(keyOf({ a = 1, b = 2 }, 2)) -- 'b'
我在 lua 中有这个 table:
local values={"a", "b", "c"}
如果变量等于 table 条目之一,是否有办法 return table 的索引? 说
local onevalue = "a"
如何在不迭代所有值的情况下获取 "a" 的索引或 table 中的一个值?
没有迭代就无法做到这一点。
如果您发现自己需要经常这样做,请考虑构建一个反向索引:
local index={}
for k,v in pairs(values) do
index[v]=k
end
return index["a"]
如果使用Lua进行Roblox开发,可以使用table.find
方法:
print(table.find({'a', 'b', 'c'}, 'b'))
接受的答案有效,但还有改进的余地:
- 为什么找到元素后不退出循环?为什么要将整个源 table 复制到一个新的一次性 table 中?
- 通常,这种函数 returns first 具有该值的数组索引,而不是 arbitrary 数组索引该值。
对于数组:
-- Return the first index with the given value (or nil if not found).
function indexOf(array, value)
for i, v in ipairs(array) do
if v == value then
return i
end
end
return nil
end
print(indexOf({'b', 'a', 'a'}, 'a')) -- 2
对于哈希 tables:
-- Return a key with the given value (or nil if not found). If there are
-- multiple keys with that value, the particular key returned is arbitrary.
function keyOf(tbl, value)
for k, v in pairs(tbl) do
if v == value then
return k
end
end
return nil
end
print(keyOf({ a = 1, b = 2 }, 2)) -- 'b'