Lua - 帮助根据自身内部的值按字母顺序对 table 数组进行排序

Lua - Help sorting table array alphabetical from value inside itself

我对 lua 编码相当陌生,一直在为 GTA 5 FiveM 脚本编写代码 我也是新来的,如果我做错了或者说解释错了,我很抱歉。

我一直在尝试制作一个脚本来处理车轮的名称、它们的 ID 以及它们是否已经安装在车辆上。

我遇到的问题是其创建的 table 更多强迫症。获取轮子名称的方法是通过它们的 ID,但这会导致和出现重复名称的问题,但它们实际上是它们的不同变体。

为了清楚起见,这是我用来制作 table 的代码片段:

for i = 1, (GetNumVehicleMods(vehicle, 23) +1) do

    local modName = GetLabelText(GetModTextLabel(vehicle, 23, (i-1)))

    txt = ""
    if GetVehicleMod(vehicle, 23) == (i-1) and tonumber(originalWheel) == tonumber(wheeltype) then  
        txt = "Currently Installed"
    end
        validMods[i] =
        {
            id = (i-1),
            name = modName,
            install = txt
        }
end

这...据我所知,它通过 ID 列出了车轮 例如:

validMods = {
    [1] = { id = 0, name = "Inferno", install = "Currently Installed" },
    [2] = { id = 1, name = "Deep Five", install = "" },
    [3] = { id = 2, name = "Inferno", install = "" },
    [4] = { id = 3, name = "Deep Five", install = "" }
}

这显然只是一个基本的类型示例,其中实际的 table 最多可以有 200 个杂乱无章的重复结果。 =33=] 按字母顺序排列。保持内容完整,但将它们重新组织为从名称顺序而不是像这样?

validMods = {
    [1] = { id = 0, name = "Inferno", install = "Currently Installed" },
    [2] = { id = 2, name = "Inferno", install = "" },
    [3] = { id = 1, name = "Deep Five", install = "" },
    [4] = { id = 3, name = "Deep Five", install = "" }
}

此外,如果可能的话...是否可以在重复名称的末尾添加额外的文本...例如:Inferno、Inferno var2、Inferno Var3


感谢您提供的任何帮助

当您以特定顺序获取这些名称时,您需要在填充 table 后对它们进行排序。

要重命名重复项,请计算您遇到一个名字的频率。

-- demo input
local validMods = {
    [1] = { id = 0, name = "Inferno", install = "Currently Installed" },
    [2] = { id = 1, name = "Deep Five", install = "" },
    [3] = { id = 2, name = "Inferno", install = "" },
    [4] = { id = 3, name = "Deep Five", install = "" }
}
-- count and rename
local names = {}
for i,v in ipairs(validMods) do
 if names[v.name] then
   names[v.name] = names[v.name] + 1
   v.name = v.name .. " var" .. names[v.name]
 else
  names[v.name] = 1
 end
end
-- sort the table by name ascending
table.sort(validMods, function(a,b) return a.name < b.name end)

-- print sorted names
for i,v in ipairs(validMods) do print(v.name) end