自动分配指定表的键值

我有三个表格。 其中一个是整数,一个是字符串,另一个是空的。 这三个表都会自动填充。 一旦填充完前两个表格(两个表格的条目数相等),我希望第三个表格自动填充,其中每个条目的键是表 'a' 的值,每个条目的值是表 'b' 的值。表 'a' 总是具有唯一的值。由于我是 Lua 的新手,请尽可能详细说明。

示例:

a = {"joe", "bob", "bill"}
b = {"24", "111", "32"}
c = {joe = "24", bob = "111", bill = "32"}

我当前的表格是这样创建的:

a = {}
b = {}
c = {}

functionThatPopulatesTableA()
end

for i, #a do
   b[i] = functionThatReturnsSpecificValue()
end

我填充表 c 的尝试结果看起来像这样:

function charlie()
    for k, v in pairs(a) do
        c[v] = a[v]
        c[k] = b[v]
    end
end

毫无疑问,那并没有起作用。

点赞
用户2238176
用户2238176

你需要更加批判地思考每种情况中的“键”和“值”。

试着像计算机一样思考:

for k, v in pairs(a) do
    c[v] = a[v]
    c[k] = b[v]
end

所以,你在示例中对 a 进行的循环看起来像这样:

k       v
--------------
1       "joe"
2       "bob"
3       "bill"

因此,c[v] = a[v] 变成了 c["joe"] = a["joe"],这变成了 c["joe"] = nil,因为 a["joe"] 未定义。所以,这显然行不通。

现在,让我们看看有效的函数:

for k, v in pairs(a) do
    c[k] = a[v]
    c[v] = b[k]
end

虽然这还不是完全正确的,但最终它确实能够工作。例如,使用与之前相同的示例,c[k] = a[v] 变成了 c[1] = a["joe"],这变成了 c[1] = nil,因为所有未定义的表值都是 nil。可以将此行从函数中删除,因为它实际上并没有做任何事情。

接下来,c[v] = b[k] 变成了 c["joe"] = b[1],这变成了 c["joe"] = 24,这正是你想要的。

2017-12-16 23:51:23
用户5331361
用户5331361

我假设你的表 a 和 b 只是值的数组:

a = {"joe", "bob", "bill"}
b = {"24", "111", "32"}

在这种情况下(如果你没有任何 nil 值),你可以使用普通的 for 循环(#length 运算符,它给你数组大小)

-- 处理表具有不同数量元素的情况
local minSize = math.min(#a, #b)
for i = 1, minSize do
    local key = a[i] -- 从表 a 中获取键
    c[key] = b[i] -- 从 b 中放入相应的值
end

如果你有存在 nil 值的表,那么这段代码将不起作用,像这样:

a = {"joy", nil, "bill" }
b = {"24", nil, "32"}

因此,在 nil 值的情况下请使用 pairs(我修复了你的代码-请参见注释):

for k, v in pairs(a) do
    -- k 等于表 a 的索引
    -- v 是该索引的表值
    c[v] = b[k]
end

如果我们以上面的表作为示例,它将按以下方式工作:

循环开始
选择 k = 1,v = “joe”
c["joe"] = b[1]
选择 k = 3,v = “bill”(记住,我们将元素 2 设置为 nil 吗?
c["bill"] = b[3]
循环结束
2017-12-17 05:57:36