Lua 如何根据表中的一个数据部分对表进行排序?

Lua 如何根据表中的一个数据部分对表进行排序?,lua,tabletop-simulator,Lua,Tabletop Simulator,我是一个使用LUA在桌面模拟器中制作mods的爱好者,有一个问题我无法解决 我有许多“对象”,它是TTS中的一个表,包含这些对象的各种数据。例如obj.position={x,y,z}。。。也可以在轴级别访问 obj.position = {5,10,15} -- x,y,z obj.position.x == 5 这是一个例子。TTS的制造商制造了它,因此您可以访问所有类似的部件。这样我就可以访问该对象。。然后是它的各个部分。有一堆,像名字,网格,difuse和更多。旋转{x,y,z}等 无

我是一个使用LUA在桌面模拟器中制作mods的爱好者,有一个问题我无法解决

我有许多“对象”,它是TTS中的一个表,包含这些对象的各种数据。例如obj.position={x,y,z}。。。也可以在轴级别访问

obj.position = {5,10,15} -- x,y,z
obj.position.x == 5
这是一个例子。TTS的制造商制造了它,因此您可以访问所有类似的部件。这样我就可以访问该对象。。然后是它的各个部分。有一堆,像名字,网格,difuse和更多。旋转{x,y,z}等

无论如何。我有一张物品表。。。并希望根据x轴的位置数据对这些对象进行排序。。从最高到最低。因此,如果我有一个表,表中的obj1是x=3,obj2是x=1,obj3=x=2,它将被排序为obj2,obj3,obj1

伪代码:

tableOfObjects = {obj1,obj2,obj3}
--[[
tableOfObjectsp[1] == obj1
tableOfObjectsp[2] == obj2
tableOfObjectsp[3] == obj3

tableOfObjectsp[1].position.x == 3
tableOfObjectsp[2].position.x == 1
tableOfObjectsp[4].position.x == 2
--]]
---After Sort it would look this list
tableOfObjects = {obj1,obj3,obj2}
    --[[
tableOfObjectsp[1] == obj1
tableOfObjectsp[2] == obj3
tableOfObjectsp[3] == obj2

tableOfObjectsp[1].position.x == 3
tableOfObjectsp[2].position.x == 2
tableOfObjectsp[3].position.x == 1
--]]
我希望我说的有道理。在过去的几个月里,我自学成才

因此,基本上我有一个对象表,并希望根据附加到表中每个对象的单个值对该表中的对象进行排序。在本例中,obj.position.x


谢谢

您需要
表。排序
。第一个参数是要排序的表,第二个参数是用于比较项的函数

例如:

t = {
    {str = 42, dex = 10, wis = 100},
    {str = 18, dex = 30, wis = 5}
}

table.sort(t, function (k1, k2)
    return k1.str < k2.str
end)
t={
{str=42,dex=10,wis=100},
{str=18,dex=30,wis=5}
}
表.排序(t,函数(k1,k2)
返回k1.str

您可以创建一个函数来处理这件事:

local function fix_table(t)
    local x_data = {};
    local inds = {};
    local rt = {};
    for i = 1, #t do
        x_data[#x_data + 1] = t[i].position.x;
        inds[t[i].position.x] = t[i];
    end
    local min_index = math.min(table.unpack(x_data));
    local max_index = math.max(table.unpack(x_data));
    for i = min_index, max_index do
        if inds[i] ~= nil then
            rt[#rt + 1] = inds[i];
        end
    end
    return rt;
end
local mytable = {obj1, obj2, obj3};
mytable = fix_table(mytable);
fix_table
首先获取给定表中的每个x值,并根据每个x值在表中放置一个新索引
inds
(以便它们从最小值到最大值排序),然后获取
x_data
数组表中的最小值,用于按顺序遍历
inds
表。fix_table检查以确保
inds[i]
不等于
nil
,然后它增加返回表
rt
的大小,这样rt中的每个值都从最大到最小排序,从索引
1
开始,到索引
rt
结束,最后返回
rt

我希望这有帮助

table.sort(tableOfObjects, function(a, b) return a.position.x > b.position.x end)
此行将按x坐标降序排列对象表


若要颠倒顺序,请替换>,让我来解释一下,您希望{obj1,obj2,obj3}中的最大值是表中的第一个索引,最小值是最后一个?我想根据每个对象的位置.x,将表中的对象从表[1]->end中排序。所以如果x轴在世界空间中的位置像。。。3,2,1,0,-1,-2,-3为什么不简单地使用
表。排序
?也在表中使用“#inds”,然后检查
如果inds[i]~=nil
没有任何意义,因为使用
#inds
无法达到nil值<代码>解包
已弃用。使用
表格。打开包装
instead@Piglet我用Lua5。1@Piglet,我不同意,想象一下,如果obj3.position.x是一个与其他x值相差很远的疯狂数字,那么尝试索引obj3.position.x和最后一个有效索引之间的所有内容将返回nil,在这种情况下,如果我不检查
if inds[I]==nil
然后我将尝试索引一个nil值,因此将发生错误,线程将停止。请记住,我正在从最低索引迭代到最高索引。如果
#inds
没有削减它,那么最高的索引就是
math.max(解包(x_数据)):)