Lua - merge tables?

前端 未结 8 1417
忘掉有多难
忘掉有多难 2020-11-28 06:45

I need to merge two tables, with the contents of the second overwriting contents in the first if a given item is in both. I looked but the standard libraries don\'t seem to

相关标签:
8条回答
  • 2020-11-28 06:50

    Here's what i came up with based on Doug Currie's answer:

    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
    
    0 讨论(0)
  • 2020-11-28 06:52

    I preferred James version for its simplicity and use it in my utils.lua - i did add a check for table type for error handling.

    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
    

    Thanks for this nice function which should be part of the table class so you could call a:merge(b) but doing table.merge = function(a, b) ... did not work for me. Could even be compressed to a one liner for the real nerds :)

    0 讨论(0)
  • 2020-11-28 06:58

    For numeric-index table merging:

    for k,v in pairs(secondTable) do table.insert(firstTable, v) end
    
    0 讨论(0)
  • 2020-11-28 06:59

    Here's iterative version for deep merge because I don't like potential stack overflows of recursive.

    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
    
    0 讨论(0)
  • 2020-11-28 07:01

    Wouldn't this work properly?

    
    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
    
    0 讨论(0)
  • 2020-11-28 07:07
    for k,v in pairs(t2) do t1[k] = v end
    

    key for string solution

    0 讨论(0)
提交回复
热议问题