如何循环遍历表格并保持顺序?

我有如下的表格:

local a = {
    [12 * 30 * 24 * 60 * 60]  =  'year',
    [30 * 24 * 60 * 60]       =  'month',
    [24 * 60 * 60]            =  'day',
    [60 * 60]                 =  'hour',
    [60]                      =  'minute',
    [1]                       =  'second'
}

然而,当我遍历并打印键和值时,我得到了这个:

for seconds, str in pairs(a) do
    print (seconds, str)
end
----------
31104000    year
60          minute
3600        hour
1           second
2592000     month
86400       day

正如您看到的那样,顺序完全混乱了。 我如何遍历这个表,并保持顺序?

点赞
用户3204551
用户3204551

你有一个误解:

Lua表格明确不保留输入元素的顺序,因此事后没有办法引用那个顺序。

(在幕后,它们当前是数组和哈希图的混合)

你可能真正想要的(根据你提供的示例)是按键值顺序迭代元素。

这当然是可能的,但需要一个自定义的迭代器。

迭代器的工作原理:

what is actual implementation of lua __pairs?

Difference between stateful and stateless iterators in Lua

function sorted_iter(t)
  local i = {}
  for k in next, t do
    table.insert(i, k)
  end
  table.sort(i)
  return function()
    local k = table.remove(i)
    if k ~= nil then
      return k, t[k]
    end
  end
end

因此,你的循环变为:

for seconds, str in sorted_iter(a) do
    print (seconds, str)
end
2014-07-12 15:23:59
用户2226988
用户2226988

你不能直接这样做。你需要构建一个不同的表结构,最好从一开始就开始构建:

local a = {
    { seconds = 12 * 30 * 24 * 60 * 60, name  =  'year'},
    ...
}

假设你不添加或删除任何元素,那么表的数组部分将会是一个序列。对于序列,可以使用 # 长度运算符或 ipairs 进行迭代。

2014-07-12 15:24:35