2009-08-16 17 views
49

यदि किसी दिए गए आइटम दोनों में है तो मुझे दूसरी ओवरराइटिंग सामग्री की सामग्री के साथ दो टेबल मर्ज करने की आवश्यकता है। मैंने देखा लेकिन मानक पुस्तकालय इसे पेश नहीं कर रहे हैं। मुझे ऐसा फ़ंक्शन कहां मिल सकता है?लुआ - टेबल मर्ज करें?

+1

ऐसा करने का कोई भी तरीका नहीं है । क्या आप तालिका में चाबियाँ या मानों की तुलना कर रहे हैं? क्या चाबियाँ/मानों के लिए अन्य टेबल होना संभव है? ... –

+0

मुझे किसी भी प्रकार की तुलना की आवश्यकता नहीं है लेकिन मुझे उप-सारणी की आवश्यकता होगी ... – RCIX

उत्तर

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

प्रतीक्षा करें, क्या वह स्ट्रिंग कुंजियां पकड़ता है और ऐसा? – RCIX

+0

हां, स्ट्रिंग कुंजियां –

+0

हैंडल की जाती हैं, यह सबटेबल्स को संभालने के लिए कुछ ट्वीकिंग के साथ काम करना चाहिए। धन्यवाद! – RCIX

16

यहाँ मैं क्या डौग करी के उत्तर के आधार पर के साथ आया है:

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 
+6

ध्यान दें कि मानक लुआ "नेमस्पेस" (तालिका जैसे *) के साथ गड़बड़ करना आम तौर पर एक बुरा विचार है। अपना खुद का बनाना बेहतर है। –

+4

"अगर टी 1 [के] नहीं है तो टी 1 [के] = {} अंत" में एक सूक्ष्म बग होता है (इसे ढूंढें!) बेहतर इसे "t1 [k] = t1 [k] या {}" के रूप में लिखें। इसके अलावा, क्या होता है यदि टी 2 [के] एक टेबल है लेकिन टी 1 [के] मौजूद है लेकिन एक टेबल नहीं है? अंत में, "table1 [k] = v" होना चाहिए "t1 [k] = v"। – lhf

+0

सभी अच्छे अंक, मैं उन्हें तुरंत ठीक कर दूंगा। – RCIX

10

चाहेंगे इस ठीक से काम नहीं?


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 
+2

हां, लेकिन यदि आप आरसीईक्स की मूल पोस्ट को देखते हैं, तो वहां कुछ अलग तर्क थे जिन्हें बाद में दो समान 'अन्य' कथनों में सरलीकृत किया गया था। आपके पास यहां जो कुछ है, उसे और अधिक सरल बनाना चाहिए था। – BMitch

+0

मुझे आपके उत्तर की संक्षिप्तता पसंद है, धन्यवाद। –

2

गहरे विलय के लिए यहां पुनरावृत्ति संस्करण है क्योंकि मुझे रिकर्सिव के संभावित ढेर ओवरफ्लो पसंद नहीं हैं।

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

आप यह जांचना भूल गए कि 'merge_task' आपकी उपलब्ध स्मृति को ओवरफ़्लो करता है ... – Irfy

+1

@Irfy, आपको पता है कि आप लुआ में ऐसा नहीं कर सकते हैं, है ना? –

+1

मेरी टिप्पणी एक कटाक्ष के रूप में थी: यदि आप रिकर्सन से बचते हैं क्योंकि आप डरते हैं/स्टैक ओवरफ्लो की अपेक्षा करते हैं; और तब जांच न करें कि क्या आपका कार्य कंटेनर आपकी याददाश्त को बहता है, फिर यह पहली जगह में रिकर्सन से बचने के लिए ज्यादा समझ में नहीं आता है। – Irfy

1

अधिकांश मामलों के लिए डौग करी का जवाब सबसे सरल है। यदि आपको तालिकाओं के अधिक मजबूत विलय की आवश्यकता है, तो 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 
-- } 
+0

तीसरा पैरामीटर क्या है, बीटीडब्ल्यू? –

+0

तीसरा पैरा निर्धारित करता है कि टेबल कैसे विलय किए जाते हैं: एक संघ के लिए 'सत्य', एक चौराहे के लिए 'झूठा'। https://github.com/stevedonovan/Penlight/blob/master/lua/pl/tablex.lua#L554 – Blackcoat

0

मैं अपनी सादगी के लिए जेम्स संस्करण को प्राथमिकता दी और मेरे 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) ... कर मेरे लिए काम नहीं किया के लिए धन्यवाद। यहां तक ​​कि स्ट्रिंग समाधान

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

कुंजी के लिए एक एक लाइनर के लिए संकुचित किया जा सकता है:

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

संख्यात्मक सूचकांक तालिका मर्ज करने के लिए के लिए असली नर्ड :)