如何向现有文件中插入数据和表格?

我在向已经存在的文件中插入新行和表格时遇到了麻烦。

假设源文件是_SourceFile.lua_,其简化内容如下:

SourceFile = {};

SourceFile.list = {
    BrandName1 = {
        number = 10,
        products = {
            "Product1", 3,
            "Product2", 4,
            "Product3", 7,
        },
    },
    BrandName2 = {
        number = 5,
        products = {
            "Product1", 10,
            "Product2", 3,
            "Product3", 6,
        },
    },
    -- and so on
}

我想做这样的事情:

require 'SourceFile'

local myData = {
  BrandName2 = { -- add new products for the existing brand
    products = {
      "Product4", 2,
    },
  },
  MyBrandName1 = { -- add new brand
    number = 12,
    products = {
      "MyProduct1", 21,
      "MyProduct2", 95,
    },
  },
  -- and so on
}

table.insert(SourceFile.list, myData)

然而我的代码有问题,我得到了以下结果(使用 inspect 输出):

{
  list = { {
      BrandName2 = {
        products = { "Product4", 2 }
      },
      MyBrandName1 = {
        number = 12,
        products = { "MyProduct1", 21, "MyProduct2", 95 }
      }
    },
    BrandName1 = {
      number = 10,
      products = { "Product1", 3, "Product2", 4, "Product3", 7 }
    },
    BrandName2 = {
      number = 5,
      products = { "Product1", 10, "Product2", 3, "Product3", 6 }
    }
  }
}

我做错了什么?

我是 Lua 新手,很确定这是显而易见的问题,但对我来说却不是。请帮帮我。


补充

得到这些回答之后,我还找到了一种方法可以逐个添加新品牌名称:

SourceFile.list.MyBrandName1 = {
    number = 12,
    products = {
      "MyProduct1", 21,
      "MyProduct2", 95,
    },
}

这并没有完全回答我的问题,但可能对 Lua 新手有用。

点赞
用户8621712
用户8621712

你正在将一个品牌名称表格推入品牌名称列表中。

这使得它成为一个品牌名称列表 + 包含品牌名称的表格。

table.insert(SourceFile.list, myData)

这将 myData 插入到 SourceFile.list 中。myData 是一个包含品牌名称的表格。 SourceFile.list 也是一个包含品牌名称的表格。 嵌套列表。

你有两个解决方案:

  1. 分别插入每个品牌名称
  2. 创建一个函数,将 myData 的内容合并到 SourceFile.list 中。
2020-11-05 19:08:34
用户3574628
用户3574628

table.insert 将第二个参数添加到数组(第一个参数)中。您的 SourceFile.list 应该只有字符串键,所以它不能作为数组使用。您需要一个递归函数来将一个表格中的数据合并到另一个表格中:

local function meld(data, newData)
  for k, v in pairs(newData) do
    local oldValue = data[k]
    if type(oldValue) ~= 'table' or type(v) ~= 'table' then
      -- 其中一个值不是表格,因此让我们覆盖旧值。
      data[k] = v
    else
      -- 两个都是表格。
      meld(oldValue, v)
    end
  end
end

meld(SourceFile.list, myData)
2020-11-05 20:25:20