سؤال

أحتاج إلى دمج جدولين، مع محتويات محتويات الكتابة الفرعية الثانية في الأول إذا كان عنصر معين في كليهما. نظرت لكن المكتبات القياسية لا يبدو أنها تقدم هذا. أين يمكنني الحصول على مثل هذه الوظيفة؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

إليك ما توصلت إليه على إجابة دوغ كوري:

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

إجابة دوغ كوري هي أبسط بالنسبة لمعظم الحالات. إذا كنت بحاجة إلى دمج أكثر قوة للجداول، فكر في استخدام merge() طريقة من الإصابة مكتبة.

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

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

فضلت إصدار 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) ... لا يعمل بالنسبة لي. يمكن حتى أن يتم ضغطها إلى بطانة واحدة للنقر الحقيقي :)

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

مفتاح حل السلسلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top