TL; DR 我正在搜索最高效的方式来更改lua表的键,其中所有索引都是数字。
我在Lua上用微处理单元获得了一个网络服务。
此服务接收一个数组作为以下结构的JSON,其中对象本身将在从JSON解析为lua-table后由lua使用。
JSON
[
[
[a,b,c],[d,e,f]
],[
[g,h,i],[j,k,l]
]
]
Lua Table
parsedJSON = { [1] = {
[1] = { [1] = a, [2] = b, [3] = c },
[2] = { [1] = d, [2] = e, [3] = f }
},
[2] = {
[1] = { [1] = g, [2] = g, [3] = i },
[2] = { [1] = j, [2] = k, [3] = l }
}
}
查看a | b | c的索引,它们是:
parsedJSON[1][1][1] = a
parsedJSON[1][1][2] = b
parsedJSON[1][1][3] = c
到目前为止一切都很好。但最深的指数并不是网络服务所不包括的。除了1/2/3作为索引但是1/9/17之外,Lua-site还没有。
像这样:
parsedJSON[1][1][1] = a
parsedJSON[1][1][9] = b
parsedJSON[1][1][17] = c
由于服务在MPU上运行,计算能力非常有限,我想知道更改这些密钥的最佳方式。
简单的对循环肯定是一种有效的解决方案,但效率不高。 我想在某种程度上使用了metatable,不是吗?
编辑:
结构不会改变并且正在修复。 请问从idx [9]到idx [2]以及从[17]到[3]的引用是一个好方法,并保持表格原样吗?
答案 0 :(得分:0)
Metatables不是性能的解决方案,仅仅是为了实用性。通过获取最内层表的引用然后在那里移动值,重新排序将是快速解决方案。将旧字段设置为nil,因此内部数组可以缩小,并且正在使用更少的内存。
答案 1 :(得分:0)
我现在无法测试它,但imo可以使用元素的普通table.insert()的变体到[x] [y],其中索引号0(通常不使用)将保存一个表你将为json {1,9,17}添加索引号,并且正常索引将自动递增,这意味着
[1][1][0] = {1,9,17}
[1][1][1] = 100
[1][1][2] = 900
[1][1][3] = 1700
现在,如果你需要JSON索引1.1.9的值,你需要用ipairs(i,v)检查字段[1] [1] [0]的值(v)并存储它的索引(i)。然后你只需从[1] [1] [i]获得价值。在那里你应该能够删除或只是修改这些值,防止他们的两面性或覆盖
可能不是最简单的方法,但可能是最安全和可以理解的调试