【问题标题】:Extract all keys and values ​from a table从表中提取所有键和值
【发布时间】:2021-02-21 22:25:44
【问题描述】:

我有一个表是 json 解析器的结果,我想从该表以及其中的表中提取所有键和值。我该怎么做?

例子:

t = {
    a = {
        1,
        b = {2, 3},
        4,
    },
    c = {5, 6, 7}
}

result = extract(t) --result = a=(1, 4) b=(2, 3) c=(5, 6, 7)

【问题讨论】:

  • 您能否澄清一下,您想“扁平化”表格,使其不包含嵌套表格?

标签: lua lua-table


【解决方案1】:

您可以通过遍历表并为每个键收集一个包含所有非表值的辅助数组来做到这一点。如果一个值是一个表,则重复该过程,直到遍历整个树。

t = {
   a = {
      1,
      b = {2, 3},
      4,
   },
   c = {5, 6, 7}
}

function rkeys(t, acc, name)
   local ret = {}
   for k, v in pairs(t) do
      if type(v) ~= 'table' then
         table.insert(ret, v)
      else
         rkeys(v, acc, k)
      end
   end
   if #ret > 0 then
      table.insert(acc, { [name] = ret })
   end
end

function extract(t)
   local ret = {}
   rkeys(t, ret)
   return ret
end

local result = extract(t)
for k,v in pairs(result) do
   for k1,v1 in pairs(v) do
      io.write(k1..": ") print("{"..table.concat(v1, ",").."}")
   end
end

结果:

b: {2,3}
a: {1,4}
c: {5,6,7}

由于树被深度遍历,表中较深的表值首先出现。如果您想首先获得结果的广度,则需要使用辅助列表 [1](这将为您提供 {a, c, b})。

[1]https://www.cs.bu.edu/teaching/c/tree/breadth-first/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多