cocos2d-Lua 里面封裝的一些關于lua表操作 包含克隆 序列化和反序列化

--[[--

深度克隆一個值

~~~ lua

-- 下面的代碼,t2 是 t1 的引用探颈,修改 t2 的屬性時训措,t1 的內容也會發(fā)生變化
local t1 = {a = 1, b = 2}
local t2 = t1
t2.b = 3    -- t1 = {a = 1, b = 3} <-- t1.b 發(fā)生變化

-- clone() 返回 t1 的副本光羞,修改 t2 不會影響 t1
local t1 = {a = 1, b = 2}
local t2 = clone(t1)
t2.b = 3    -- t1 = {a = 1, b = 2} <-- t1.b 不受影響

~~~

@param mixed object 要克隆的值

@return mixed

]]
function clone(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
        local new_table = {}
        lookup_table[object] = new_table
        for key, value in pairs(object) do
            new_table[_copy(key)] = _copy(value)
        end
        return setmetatable(new_table, getmetatable(object))
    end
    return _copy(object)
end

--[[--

計算表格包含的字段數量

Lua table 的 "#" 操作只對依次排序的數值下標數組有效纱兑,table.nums() 則計算 table 中所有不為 nil 的值的個數化借。

@param table t 要檢查的表格

@return integer

]]
function table.nums(t)
    local count = 0
    for k, v in pairs(t) do
        count = count + 1
    end
    return count
end

--[[--

返回指定表格中的所有鍵

~~~ lua

local hashtable = {a = 1, b = 2, c = 3}
local keys = table.keys(hashtable)
-- keys = {"a", "b", "c"}

~~~

@param table hashtable 要檢查的表格

@return table

]]
function table.keys(hashtable)
    local keys = {}
    for k, v in pairs(hashtable) do
        keys[#keys + 1] = k
    end
    return keys
end

--[[--

返回指定表格中的所有值

~~~ lua

local hashtable = {a = 1, b = 2, c = 3}
local values = table.values(hashtable)
-- values = {1, 2, 3}

~~~

@param table hashtable 要檢查的表格

@return table

]]
function table.values(hashtable)
    local values = {}
    for k, v in pairs(hashtable) do
        values[#values + 1] = v
    end
    return values
end

--[[--

將來源表格中所有鍵及其值復制到目標表格對象中蓖康,如果存在同名鍵,則覆蓋其值

~~~ lua

local dest = {a = 1, b = 2}
local src  = {c = 3, d = 4}
table.merge(dest, src)
-- dest = {a = 1, b = 2, c = 3, d = 4}

~~~

@param table dest 目標表格
@param table src 來源表格

]]
function table.merge(dest, src)
    for k, v in pairs(src) do
        dest[k] = v
    end
end 

function table.add(dest, src)
    local size = #dest
    for i, v in ipairs(src) do
        dest[size+i] = v
    end
end  

--[[--

在目標表格的指定位置插入來源表格倒信,如果沒有指定位置則連接兩個表格

~~~ lua

local dest = {1, 2, 3}
local src  = {4, 5, 6}
table.insertto(dest, src)
-- dest = {1, 2, 3, 4, 5, 6}

dest = {1, 2, 3}
table.insertto(dest, src, 5)
-- dest = {1, 2, 3, nil, 4, 5, 6}

~~~

@param table dest 目標表格
@param table src 來源表格
@param [integer begin] 插入位置

]]
function table.insertto(dest, src, begin)
    begin = checkint(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
end

--[[

從表格中查找指定值鳖悠,返回其索引优妙,如果沒找到返回 false

~~~ lua

local array = {"a", "b", "c"}
print(table.indexof(array, "b")) -- 輸出 2

~~~

@param table array 表格
@param mixed value 要查找的值
@param [integer begin] 起始索引值

@return integer

]]
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

--[[--

從表格中查找指定值套硼,返回其 key,如果沒找到返回 nil

~~~ lua

local hashtable = {name = "dualface", comp = "chukong"}
print(table.keyof(hashtable, "chukong")) -- 輸出 comp

~~~

@param table hashtable 表格
@param mixed value 要查找的值

@return string 該值對應的 key

]]
function table.keyof(hashtable, value)
    for k, v in pairs(hashtable) do
        if v == value then return k end
    end
    return nil
end

--[[--

從表格中刪除指定值,返回刪除的值的個數

~~~ lua

local array = {"a", "b", "c", "c"}
print(table.removebyvalue(array, "c", true)) -- 輸出 2

~~~

@param table array 表格
@param mixed value 要刪除的值
@param [boolean removeall] 是否刪除所有相同的值

@return integer

]]
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

--[[--

對表格中每一個值執(zhí)行一次指定的函數抄罕,并用函數返回值更新表格內容

~~~ lua

local t = {name = "dualface", comp = "chukong"}
table.map(t, function(v, k)
    -- 在每一個值前后添加括號
    return "[" .. v .. "]"
end)

-- 輸出修改后的表格內容
for k, v in pairs(t) do
    print(k, v)
end

-- 輸出
-- name [dualface]
-- comp [chukong]

~~~

fn 參數指定的函數具有兩個參數呆贿,并且返回一個值森渐。原型如下:

~~~ lua

function map_function(value, key)
    return value
end

~~~

@param table t 表格
@param function fn 函數

]]
function table.map(t, fn)
    for k, v in pairs(t) do
        t[k] = fn(v, k)
    end
end

--[[--

對表格中每一個值執(zhí)行一次指定的函數,但不改變表格內容

~~~ lua

local t = {name = "dualface", comp = "chukong"}
table.walk(t, function(v, k)
    -- 輸出每一個值
    print(v)
end)

~~~

fn 參數指定的函數具有兩個參數竟块,沒有返回值耐齐。原型如下:

~~~ lua

function map_function(value, key)

end

~~~

@param table t 表格
@param function fn 函數

]]
function table.walk(t, fn)
    for k,v in pairs(t) do
        fn(v, k)
    end
end

--[[--

對表格中每一個值執(zhí)行一次指定的函數,如果該函數返回 false耸携,則對應的值會從表格中刪除

~~~ lua

local t = {name = "dualface", comp = "chukong"}
table.filter(t, function(v, k)
    return v ~= "dualface" -- 當值等于 dualface 時過濾掉該值
end)

-- 輸出修改后的表格內容
for k, v in pairs(t) do
    print(k, v)
end

-- 輸出
-- comp chukong

~~~

fn 參數指定的函數具有兩個參數夺衍,并且返回一個 boolean 值。原型如下:

~~~ lua

function map_function(value, key)
    return true or false
end

~~~

@param table t 表格
@param function fn 函數

]]
function table.filter(t, fn)
    for k, v in pairs(t) do
        if not fn(v, k) then t[k] = nil end
    end
end

--[[--

遍歷表格河劝,確保其中的值唯一

~~~ lua

local t = {"a", "a", "b", "c"} -- 重復的 a 會被過濾掉
local n = table.unique(t)

for k, v in pairs(n) do
    print(v)
end

-- 輸出
-- a
-- b
-- c

~~~

@param table t 表格

@return table 包含所有唯一值的新表格

]]
function table.unique(t)
    local check = {}
    local n = {}
    for k, v in pairs(t) do
        if not check[v] then
            n[k] = v
            check[v] = true
        end
    end
    return n
end

--[[

隨機提取子集組數

]]--

function table.randSubArray(t, minCount, maxCount)
    local values = table.values(t)
    local r = math.random(minCount, maxCount)
   
    if #values > r then
        local removeCount = #values - r
        for i = 1, removeCount do
            table.remove(values, math.random(1, #values))
        end
    end
    return values
end

--[[

移除測試返回ture的項

]]--

function table.removeByCheck(array, fun, removeall)
    local c, i, max = 0, 1, #array
    while i <= max do
        if fun(array[i]) 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

--[[

table為空

]]--

function table.isEmpty(t)
    return next(t) == nil
end

--[[

唯一值數組

]]--

function table.uniqueArray(t)
    local check = {}
    local n = {}
    for i, v in ipairs(t) do
        if not check[v] then
            table.insert(n, v)
            check[v] = true
        end
    end
    return n
end

--[[

數組為空

]]--

function table.isArrayEmpty(t)
    return #t == 0
end

--[[
表序列化成字符串
]]
function table.tostring(t)
    local mark={}
    local assign={}
    local function ser_table(tbl,parent)
        mark[tbl]=parent
        local tmp={}
        for k,v in pairs(tbl) do
            local key= type(k)=="number" and "["..k.."]" or "[".. string.format("%q", k) .."]"
            if type(v)=="table" then
                local dotkey= parent.. key
                if mark[v] then
                    table.insert(assign,dotkey.."='"..mark[v] .."'")
                else
                    table.insert(tmp, key.."="..ser_table(v,dotkey))
                end
            elseif type(v) == "string" then
                table.insert(tmp, key.."=".. string.format('%q', v))
            elseif type(v) == "number" or type(v) == "boolean" then
                table.insert(tmp, key.."=".. tostring(v))
            end
        end
        return "{"..table.concat(tmp,",").."}"
    end
    return ser_table(t,"ret")..table.concat(assign," ")
end

--[[
字符串反序列化成表
table名為ret
]]
function table.loadstring(strData)
    local f = loadstring(strData)
    if f then
       return f()
    end
end


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末含衔,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子贪染,更是在濱河造成了極大的恐慌杭隙,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件票髓,死亡現場離奇詭異铣耘,居然都是意外死亡,警方通過查閱死者的電腦和手機裆操,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門踪区,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吊骤,“玉大人,你說我怎么就攤上這事密强。” “怎么了或渤?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵薪鹦,是天一觀的道長。 經常有香客問我奔害,道長地熄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任雅潭,我火速辦了婚禮扶供,結果婚禮上裂明,老公的妹妹穿的比我還像新娘。我一直安慰自己扳碍,他們只是感情好仙蛉,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布捅儒。 她就那樣靜靜地躺著振亮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坊秸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天阶牍,我揣著相機與錄音,去河邊找鬼惧辈。 笑死磕瓷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的边翁。 我是一名探鬼主播硕盹,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瘩例,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仰剿?” 一聲冷哼從身側響起南吮,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎露乏,沒想到半個月后涂邀,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡劳较,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年观蜗,在試婚紗的時候發(fā)現自己被綠了墓捻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坊夫。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡撤卢,死狀恐怖放吩,靈堂內的尸體忽然破棺而出羽杰,到底是詐尸還是另有隱情,我是刑警寧澤腻惠,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布欲虚,位于F島的核電站,受9級特大地震影響复哆,放射性物質發(fā)生泄漏梯找。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一驯鳖、第九天 我趴在偏房一處隱蔽的房頂上張望久免。 院中可真熱鬧,春花似錦记舆、人聲如沸呼巴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屑埋。三九已至痰滋,卻和暖如春摘能,著一層夾襖步出監(jiān)牢的瞬間续崖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工团搞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留严望,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓逻恐,卻偏偏與公主長得像像吻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子复隆,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容