سؤال
أحتاج إلى دمج جدولين، مع محتويات محتويات الكتابة الفرعية الثانية في الأول إذا كان عنصر معين في كليهما. نظرت لكن المكتبات القياسية لا يبدو أنها تقدم هذا. أين يمكنني الحصول على مثل هذه الوظيفة؟
المحلول
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
فضلت إصدار 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
مفتاح حل السلسلة
لا تنتمي إلى StackOverflow