Lua table.insert - 将项插入表时的奇怪行为

我有点难以弄清楚我的代码为什么会表现出这种行为。我有一个名为 players 的表,结构为键-值对。 值也是嵌套的表(项)。每个项目都应包含至少一个名为“id”的唯一标识符,包含在嵌套表(键名)'specs' 中。

players = {

  ['identifier_one'] = {
    {
      ["label"] = "Flashlight",
      ["weight"] = 1,
      ["name"] = "WEAPON_FLASHLIGHT",
      ["specs"] =  {
        ["pockets"] = false,
        ["id"] = "ZT345", --这是我们的唯一标识符
        ["equip"] = true,
        ["stack"] = 1,
        ["craft"] = true
      }
    },
    {
      ["label"] = "Flashlight",
      ["weight"] = 1,
      ["name"] = "WEAPON_FLASHLIGHT",
      ["specs"] =  {
        ["pockets"] = false,
        ["id"] = "ACF124",
        ["equip"] = true,
        ["stack"] = 1,
        ["craft"] = true
      }
    }
  },

  ['another_item'] = {
    ...
  },
}

我得到了正确写入的数据结构。 但是,当我插入新的嵌套项时,它将 newItem 添加到下一个递增的位置中,同时覆盖了所有前面的索引。 所以以前的 items['spec']['id'] 就会变成 newItem 的 id,如果这有意义的话? 因此,看着上面的布局,以前的 id 'ZT345' 将变成 'ACF124'。 从而使这两个项目相同。

当我打印出 newItem 的内容时,一切都很完美,应该按预期写入表中。 起初,我以为可能与将表编码为 json 写入数据库有关。 但是,如果我在插入 newItem 后打印出 players[identifier] 表,它就覆盖了所有先前的索引。 所以我相当确定问题是在将 newItem 插入到 players[identifier] 中

我的代码如下:

ESX.RegisterServerCallback('zombie-inventory:itemCheck', function(source, cb, item)

  -- 检查我们的项是否允许添加。
  if items[item] then

    local src = source
    local identifier = getIdentifier(src)
    local newItem = items[item]

    if string.match(item, 'WEAPON') then
      newItem['specs'][1].id = genId(players[identifier])
    end

    -- 这一点是代码分崩离析的点。
    table.insert(players[identifier], newItem)

    MySQL.Async.execute('UPDATE `user_inventory` SET `inventory` = @inventory WHERE `identifier` = @identifier', {
      ['@identifier'] = identifier,
      ['@inventory'] = json.encode(players[identifier])
    })

    cb(true)
  else
    print(('[inventory] [^3WARNING^7] invalid item for itemCheck cb: %s'):format(item))
  end
end)

顺带一提,genId() 函数返回一个唯一的 id,我已经多次打印了这个 id,它总是不同的。

点赞