268 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Lua
		
	
			
		
		
	
	
			268 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Lua
		
	
--[[
 | 
						||
 * @Classname TableEx
 | 
						||
 * @Description table extension
 | 
						||
 * @Date 2019/5/10 20:43
 | 
						||
 * @Created by MagicianJoker
 | 
						||
--]]
 | 
						||
 | 
						||
function table.nums(t)
 | 
						||
    local count = 0
 | 
						||
    for k, v in pairs(t) do
 | 
						||
        count = count + 1
 | 
						||
    end
 | 
						||
    return count
 | 
						||
end
 | 
						||
 | 
						||
function table.insertto(dest, src, begin)
 | 
						||
    if begin <= 0 then
 | 
						||
        begin = #dest + 1
 | 
						||
    end
 | 
						||
 | 
						||
    local len = #src
 | 
						||
    for i = 0, len - 1 do
 | 
						||
        dest[i + begin] = src[i + 1]
 | 
						||
    end
 | 
						||
    return dest
 | 
						||
end
 | 
						||
 | 
						||
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
 | 
						||
 | 
						||
function table.keyof(hashtable, value)
 | 
						||
    for k, v in pairs(hashtable) do
 | 
						||
        if v == value then
 | 
						||
            return k
 | 
						||
        end
 | 
						||
    end
 | 
						||
    return false
 | 
						||
end
 | 
						||
 | 
						||
function table.keyvalueindexof(array, key, value)
 | 
						||
    for i = 1, #array do
 | 
						||
        if array[i][key] == value then
 | 
						||
            return i
 | 
						||
        end
 | 
						||
    end
 | 
						||
    return false
 | 
						||
end
 | 
						||
 | 
						||
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
 | 
						||
 | 
						||
function table.walk(t, fn)
 | 
						||
    for k, v in pairs(t) do
 | 
						||
        fn(v, k)
 | 
						||
    end
 | 
						||
end
 | 
						||
 | 
						||
function table.clone(t)
 | 
						||
    local ret = {}
 | 
						||
    for k, v in pairs(t) do
 | 
						||
        ret[k] = v
 | 
						||
    end
 | 
						||
    return ret
 | 
						||
end
 | 
						||
 | 
						||
function table.merge(dest, src)
 | 
						||
    for k, v in pairs(src) do
 | 
						||
        dest[k] = v
 | 
						||
    end
 | 
						||
    return dest
 | 
						||
end
 | 
						||
 | 
						||
function table.mergeV2(dest, src)
 | 
						||
    for k, v in pairs(src) do
 | 
						||
        if dest[k] then
 | 
						||
            dest[k] = dest[k] + v
 | 
						||
        else
 | 
						||
            dest[k] = v
 | 
						||
        end
 | 
						||
    end
 | 
						||
    return dest
 | 
						||
end
 | 
						||
 | 
						||
function table.reverse(list, s, e)
 | 
						||
    while s<e do
 | 
						||
        list[s], list[e] = list[e], list[s]
 | 
						||
        s = s+1
 | 
						||
        e = e-1
 | 
						||
    end
 | 
						||
end
 | 
						||
 | 
						||
--获取table的长度
 | 
						||
function LengthOfTable(table)
 | 
						||
    local length = 0
 | 
						||
    for i, v in pairs(table) do
 | 
						||
        length = length + 1
 | 
						||
    end
 | 
						||
    return length
 | 
						||
end
 | 
						||
 | 
						||
function DelTableByKey(tb, key)
 | 
						||
    if type(tb) ~= "table" then
 | 
						||
        error("Delete value in table,the tb is not table")
 | 
						||
    else
 | 
						||
        if tb[key] then
 | 
						||
            local i = 1
 | 
						||
            for k, v in pairs(tb) do
 | 
						||
                if k == key then
 | 
						||
                    break
 | 
						||
                end
 | 
						||
                i = i + 1
 | 
						||
            end
 | 
						||
            table.remove(tb, i)
 | 
						||
        end
 | 
						||
    end
 | 
						||
end
 | 
						||
 | 
						||
function TableInsert_CheckRepeat(targetTable, value)
 | 
						||
    for i, v in ipairs(targetTable) do
 | 
						||
        if v == value then
 | 
						||
            return
 | 
						||
        end
 | 
						||
    end
 | 
						||
 | 
						||
    table.insert(targetTable, value)
 | 
						||
end
 | 
						||
 | 
						||
function TableMerge(table1, table2, checkRepeat)
 | 
						||
    local tempTable = {}
 | 
						||
    if table1 ~= nil then
 | 
						||
        for i, v in ipairs(table1) do
 | 
						||
            if checkRepeat == false then
 | 
						||
                table.insert(tempTable, v)
 | 
						||
            else
 | 
						||
                TableInsert_CheckRepeat(tempTable, v)
 | 
						||
            end
 | 
						||
        end
 | 
						||
    end
 | 
						||
 | 
						||
    if table2 ~= nil then
 | 
						||
        for i, v in ipairs(table2) do
 | 
						||
            if checkRepeat == false then
 | 
						||
                table.insert(tempTable, v)
 | 
						||
            else
 | 
						||
                TableInsert_CheckRepeat(tempTable, v)
 | 
						||
            end
 | 
						||
        end
 | 
						||
    end
 | 
						||
 | 
						||
    return tempTable
 | 
						||
end
 | 
						||
 | 
						||
function Table_DeepCopy(object)
 | 
						||
    local lookup_table = {}
 | 
						||
    local function _copy(object)
 | 
						||
        if type(object) ~= "table" then
 | 
						||
            return object
 | 
						||
        elseif lookup_table[object] then
 | 
						||
 | 
						||
            return lookup_table[object]
 | 
						||
        end  -- if
 | 
						||
        local new_table = {}
 | 
						||
        lookup_table[object] = new_table
 | 
						||
 | 
						||
        for index, value in pairs(object) do
 | 
						||
            new_table[_copy(index)] = _copy(value)
 | 
						||
        end
 | 
						||
        return setmetatable(new_table, getmetatable(object))
 | 
						||
    end
 | 
						||
    return _copy(object)
 | 
						||
end
 | 
						||
 | 
						||
--搬运深度比较代码 url:http://www.it1352.com/537908.html
 | 
						||
function Table_Equal(table1, table2)
 | 
						||
    local avoid_loops = {}
 | 
						||
    local function recurse(t1, t2)
 | 
						||
        -- compare value types
 | 
						||
        if type(t1) ~= type(t2) then
 | 
						||
            return false
 | 
						||
        end
 | 
						||
        -- Base case: compare simple values
 | 
						||
        if type(t1) ~= "table" then
 | 
						||
            return t1 == t2
 | 
						||
        end
 | 
						||
        -- Now, on to tables.
 | 
						||
        -- First, let's avoid looping forever.
 | 
						||
        if avoid_loops[t1] then
 | 
						||
            return avoid_loops[t1] == t2
 | 
						||
        end
 | 
						||
        avoid_loops[t1] = t2
 | 
						||
        -- Copy keys from t2
 | 
						||
        local t2keys = {}
 | 
						||
        local t2tablekeys = {}
 | 
						||
        for k, _ in pairs(t2) do
 | 
						||
            if type(k) == "table" then
 | 
						||
                table.insert(t2tablekeys, k)
 | 
						||
            end
 | 
						||
            t2keys[k] = true
 | 
						||
        end
 | 
						||
        -- Let's iterate keys from t1
 | 
						||
        for k1, v1 in pairs(t1) do
 | 
						||
            local v2 = t2[k1]
 | 
						||
            if type(k1) == "table" then
 | 
						||
                -- if key is a table, we need to find an equivalent one.
 | 
						||
                local ok = false
 | 
						||
                for i, tk in ipairs(t2tablekeys) do
 | 
						||
                    if Table_Equal(k1, tk) and recurse(v1, t2[tk]) then
 | 
						||
                        table.remove(t2tablekeys, i)
 | 
						||
                        t2keys[tk] = nil
 | 
						||
                        ok = true
 | 
						||
                        break
 | 
						||
                    end
 | 
						||
                end
 | 
						||
                if not ok then
 | 
						||
                    return false
 | 
						||
                end
 | 
						||
            else
 | 
						||
                -- t1 has a key which t2 doesn't have, fail.
 | 
						||
                if v2 == nil then
 | 
						||
                    return false
 | 
						||
                end
 | 
						||
                t2keys[k1] = nil
 | 
						||
                if not recurse(v1, v2) then
 | 
						||
                    return false
 | 
						||
                end
 | 
						||
            end
 | 
						||
        end
 | 
						||
        -- if t2 has a key which t1 doesn't have, fail.
 | 
						||
        if next(t2keys) then
 | 
						||
            return false
 | 
						||
        end
 | 
						||
        return true
 | 
						||
    end
 | 
						||
    return recurse(table1, table2)
 | 
						||
    --print( Table_Equal({}, {}) )
 | 
						||
    --print( Table_Equal({1,2,3}, {1,2,3}) )
 | 
						||
    --print( Table_Equal({1,2,3, foo = "fighters"}, {["foo"] = "fighters", 1,2,3}) )
 | 
						||
    --print( Table_Equal({{{}}}, {{{}}}) )
 | 
						||
    --print( Table_Equal({[{}] = {1}, [{}] = {2}}, {[{}] = {1}, [{}] = {2}}) )
 | 
						||
    --print( Table_Equal({a = 1, [{}] = {}}, {[{}] = {}, a = 1}) )
 | 
						||
    --print( Table_Equal({a = 1, [{}] = {1}, [{}] = {2}}, {[{}] = {2}, a = 1, [{}] = {1}}) ) --TODO:`false` under Lua 5.2
 | 
						||
 | 
						||
    --print( not Table_Equal({1,2,3,4}, {1,2,3}) )
 | 
						||
    --print( not Table_Equal({1,2,3, foo = "fighters"}, {["foo"] = "bar", 1,2,3}) )
 | 
						||
    --print( not Table_Equal({{{}}}, {{{{}}}}) )
 | 
						||
    --print( not Table_Equal({[{}] = {1}, [{}] = {2}}, {[{}] = {1}, [{}] = {2}, [{}] = {3}}) )
 | 
						||
    --print( not Table_Equal({[{}] = {1}, [{}] = {2}}, {[{}] = {1}, [{}] = {3}}) )
 | 
						||
end |