bayuMIR/Mirserver/Mir200/Envir/Extension/LuaLibrary/table.lua
2026-06-12 00:25:44 +08:00

224 lines
No EOL
5.2 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 判断表是否为空
---@param t table 要判断的表
---@return boolean 如果表为空则返回true否则返回false
function table.isempty(t)
for k, v in pairs(t) do
return false
end
return true
end
-- 获取表的元素数量
---@param t table 要获取元素数量的表
---@return number 表的元素数量
function table.nums(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
-- 获取表的所有键
---@param hashtable table 要获取键的表
---@return table 表的所有键
function table.keys(hashtable)
local keys = {}
for k, v in pairs(hashtable) do
keys[#keys + 1] = k
end
return keys
end
-- 获取表的所有值
---@param hashtable table 要获取值的表
---@return table 表的所有值
function table.values(hashtable)
local values = {}
for k, v in pairs(hashtable) do
values[#values + 1] = v
end
return values
end
-- 合并两个表
---@param dest table 目标表
---@param src table 源表
function table.merge(dest, src)
for k, v in pairs(src) do
dest[k] = v
end
end
-- 将一个表插入到另一个表的指定位置
---@param dest table 目标表
---@param src table 要插入的表
---@param begin number 开始插入的位置默认为0
function table.insertto(dest, src, begin)
begin = begin or 0
if begin <= 0 then
begin = #dest + 1
end
local len = #src
for i = 0, len - 1 do
dest[i + begin] = src[i + 1]
end
end
-- 在序列表中查找指定的值并返回其索引
---@param array table 要查找的序列表
---@param value any 要查找的值
---@param begin number 开始查找的位置默认为1
---@return number|boolean 如果找到值则返回其索引否则返回false
function table.indexof(array, value, begin)
for i = begin or 1, #array do
if array[i] == value then return i end
end
return false
end
-- 在表中查找指定值的键
---@param hashtable table 要查找的表
---@param value any 要查找的值
---@return any|nil 如果找到值则返回其键否则返回nil
function table.keyof(hashtable, value)
for k, v in pairs(hashtable) do
if v == value then return k end
end
return nil
end
-- 从数组中移除指定值
---@param array table 要移除值的数组
---@param value any 要移除的值
---@param removeall boolean 是否移除所有匹配的值默认为false
---@return number 移除的值的数量
function table.removebyvalue(array, value, removeall)
local c, i, max = 0, 1, #array
while i <= max do
if array[i] == value then
table.remove(array, i)
c = c + 1
i = i - 1
max = max - 1
if not removeall then break end
end
i = i + 1
end
return c
end
-- 对表中的每个元素进行映射操作
---@param t table 要进行映射操作的表
---@param fn function 映射操作的函数
function table.map(t, fn)
for k, v in pairs(t) do
t[k] = fn(v, k)
end
end
-- 对表中的每个元素进行遍历操作
---@param t table 要进行遍历操作的表
---@param fn function 遍历操作的函数
function table.walk(t, fn)
for k,v in pairs(t) do
fn(v, k)
end
end
-- 对表中的每个元素进行过滤操作
---@param t table 要进行过滤操作的表
---@param fn function 过滤操作的函数
function table.filter(t, fn)
for k, v in pairs(t) do
if not fn(v, k) then t[k] = nil end
end
end
-- 去除表中的重复元素
---@param t table 要去除重复元素的表
---@param bArray boolean 是否为数组默认为false
---@return table 去除重复元素后的表
function table.unique(t, bArray)
local check = {}
local n = {}
local idx = 1
for k, v in pairs(t) do
if not check[v] then
if bArray then
n[idx] = v
idx = idx + 1
else
n[k] = v
end
check[v] = true
end
end
return n
end
-- 根据键值对在表中查找元素
---@param t table 要查找的表
---@param key any 键
---@param value any 值
---@return any|nil 如果找到元素则返回该元素否则返回nil
function table.findtbykv(t, key, value)
for _,v in pairs(t) do
if v[key] == value then
return v
end
end
end
-- 在数组中查找满足条件的元素
---@param t table 要查找的数组
---@param fn function 条件判断函数
---@param reverse boolean 是否反向查找默认为false
---@return any|nil 如果找到满足条件的元素则返回该元素否则返回nil
function table.findarrvalue(t, fn, reverse)
local size = #t
local begin = reverse and size or 1
local toend = reverse and 1 or size
local change = reverse and -1 or 1
local result
for i=begin,toend,change do
result = fn(t[i], i)
if result then return result end
end
end
-- 判断两个数组是否相等
---@param arr1 table 第一个数组
---@param arr2 table 第二个数组
---@return boolean 如果两个数组相等则返回true否则返回false
function table.arrequal(arr1, arr2)
local size1, size2 = #arr1, #arr2
if size1 ~= size2 then return false end
for k,v1 in ipairs(arr1) do
local v2 = arr2[k]
if v1 ~= v2 then return false end
end
return true
end
-- 复制非镜像表
function table.Copy(orig)
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in next, orig, nil do
copy[table.Copy(orig_key)] = table.Copy(orig_value)
end
setmetatable(copy, table.Copy(getmetatable(orig)))
else -- number, string, boolean, etc
copy = orig
end
return copy
end