簡體   English   中英

如何合並兩個表來覆蓋兩個表中的元素?

[英]How to merge two tables overwriting the elements which are in both?

我需要合並兩個表,如果給定項目在兩個表中,則第二個表的內容覆蓋第一個表中的內容。 我看了看,但標准庫似乎沒有提供這個。 這樣的function哪里能弄到?

for k,v in pairs(second_table) do first_table[k] = v end

這是我根據 Doug Currie 的回答得出的結論:

function tableMerge(t1, t2)
    for k,v in pairs(t2) do
        if type(v) == "table" then
            if type(t1[k] or false) == "table" then
                tableMerge(t1[k] or {}, t2[k] or {})
            else
                t1[k] = v
            end
        else
            t1[k] = v
        end
    end
    return t1
end

這不會正常工作嗎?


function merge(t1, t2)
    for k, v in pairs(t2) do
        if (type(v) == "table") and (type(t1[k] or false) == "table") then
            merge(t1[k], t2[k])
        else
            t1[k] = v
        end
    end
    return t1
end

對於數字索引表合並:

for k,v in pairs(secondTable) do table.insert(firstTable, v) end

這是深度合並的迭代版本,因為我不喜歡遞歸的潛在堆棧溢出。

local merge_task = {}
function merge_to_left_o(orig, new)
   merge_task[orig] = new

   local left = orig
   while left ~= nil do
      local right = merge_task[left]
      for new_key, new_val in pairs(right) do
         local old_val = left[new_key]
         if old_val == nil then
            left[new_key] = new_val
         else
            local old_type = type(old_val)
            local new_type = type(new_val)
            if (old_type == "table" and new_type == "table") then
               merge_task[old_val] = new_val
            else
               left[new_key] = new_val
            end
         end
      end
      merge_task[left] = nil
      left = next(merge_task)
   end
end

我更喜歡 James 版本,因為它的簡單性並在我的 utils.lua 中使用它 - 我確實為錯誤處理添加了對表類型的檢查。

function merge(a, b)
    if type(a) == 'table' and type(b) == 'table' then
        for k,v in pairs(b) do if type(v)=='table' and type(a[k] or false)=='table' then merge(a[k],v) else a[k]=v end end
    end
    return a
end

感謝這個不錯的函數,它應該是表類的一部分,所以你可以調用a:merge(b)但是做table.merge = function(a, b) ...對我不起作用。 對於真正的書呆子來說,甚至可以壓縮成一個襯墊:)

Doug Currie 的答案在大多數情況下是最簡單的。 如果您需要更強大的表合並,請考慮使用Penlight庫中的merge()方法。

require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))

-- {
--   a = 1,
--   d = 4,
--   c = 3,
--   b = 2
-- }

就像Doug Currie說的,你可以使用他的功能,但是他的方法有問題。 如果first_table在它的k索引中有東西,函數將覆蓋它。

我假設您正在嘗試合並這些表,而不是覆蓋索引和值。 所以這將是我的方法,它非常相似,但用於合並表。

for _, v in pairs(second_table) do table.insert(first_table, v) end

此解決方案的唯一問題是索引設置為數字,而不是字符串 這將適用於以數字為索引的表,對於以字符串為索引的表,請使用 Doug Currie 的方法。

道格·庫里的方法:

for k,v in pairs(second_table) do first_table[k] = v end

擴展這個很好的答案https://stackoverflow.com/a/1283399/1570165 ,我想 go 使用如下所示的(純)功能方法:

-- example values
local t1 = { a = 0, b = 2 }
local t2 = { a = 1, c = 3 }

-- merge function that takes functional approach

local merge = function(a, b)
    local c = {}
    for k,v in pairs(a) do c[k] = v end
    for k,v in pairs(b) do c[k] = v end
    return c
end

-- t1 and t2 value still same after merge
print(merge(t1, t2)) -- { a = 1, b = 2, c = 3 }
print(t2) -- { a = 1, c = 3 }
print(t1) -- { a = 0, b = 2 }

for k,v in pairs(t2) do t1[k] = v end

字符串解決方案的關鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM