यदि किसी दिए गए आइटम दोनों में है तो मुझे दूसरी ओवरराइटिंग सामग्री की सामग्री के साथ दो टेबल मर्ज करने की आवश्यकता है। मैंने देखा लेकिन मानक पुस्तकालय इसे पेश नहीं कर रहे हैं। मुझे ऐसा फ़ंक्शन कहां मिल सकता है?लुआ - टेबल मर्ज करें?
उत्तर
यहाँ मैं क्या डौग करी के उत्तर के आधार पर के साथ आया है:
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
ध्यान दें कि मानक लुआ "नेमस्पेस" (तालिका जैसे *) के साथ गड़बड़ करना आम तौर पर एक बुरा विचार है। अपना खुद का बनाना बेहतर है। –
"अगर टी 1 [के] नहीं है तो टी 1 [के] = {} अंत" में एक सूक्ष्म बग होता है (इसे ढूंढें!) बेहतर इसे "t1 [k] = t1 [k] या {}" के रूप में लिखें। इसके अलावा, क्या होता है यदि टी 2 [के] एक टेबल है लेकिन टी 1 [के] मौजूद है लेकिन एक टेबल नहीं है? अंत में, "table1 [k] = v" होना चाहिए "t1 [k] = v"। – lhf
सभी अच्छे अंक, मैं उन्हें तुरंत ठीक कर दूंगा। – RCIX
चाहेंगे इस ठीक से काम नहीं?
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
हां, लेकिन यदि आप आरसीईक्स की मूल पोस्ट को देखते हैं, तो वहां कुछ अलग तर्क थे जिन्हें बाद में दो समान 'अन्य' कथनों में सरलीकृत किया गया था। आपके पास यहां जो कुछ है, उसे और अधिक सरल बनाना चाहिए था। – BMitch
मुझे आपके उत्तर की संक्षिप्तता पसंद है, धन्यवाद। –
गहरे विलय के लिए यहां पुनरावृत्ति संस्करण है क्योंकि मुझे रिकर्सिव के संभावित ढेर ओवरफ्लो पसंद नहीं हैं।
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_task' आपकी उपलब्ध स्मृति को ओवरफ़्लो करता है ... – Irfy
@Irfy, आपको पता है कि आप लुआ में ऐसा नहीं कर सकते हैं, है ना? –
मेरी टिप्पणी एक कटाक्ष के रूप में थी: यदि आप रिकर्सन से बचते हैं क्योंकि आप डरते हैं/स्टैक ओवरफ्लो की अपेक्षा करते हैं; और तब जांच न करें कि क्या आपका कार्य कंटेनर आपकी याददाश्त को बहता है, फिर यह पहली जगह में रिकर्सन से बचने के लिए ज्यादा समझ में नहीं आता है। – Irfy
अधिकांश मामलों के लिए डौग करी का जवाब सबसे सरल है। यदि आपको तालिकाओं के अधिक मजबूत विलय की आवश्यकता है, तो 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
-- }
तीसरा पैरामीटर क्या है, बीटीडब्ल्यू? –
तीसरा पैरा निर्धारित करता है कि टेबल कैसे विलय किए जाते हैं: एक संघ के लिए 'सत्य', एक चौराहे के लिए 'झूठा'। https://github.com/stevedonovan/Penlight/blob/master/lua/pl/tablex.lua#L554 – Blackcoat
मैं अपनी सादगी के लिए जेम्स संस्करण को प्राथमिकता दी और मेरे 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
कुंजी के लिए एक एक लाइनर के लिए संकुचित किया जा सकता है:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
संख्यात्मक सूचकांक तालिका मर्ज करने के लिए के लिए असली नर्ड :)
- 1. लुआ टेबल
- 2. लुआ टेबल लुकअप
- 3. लुआ टेबल लाइब्रेरी हटा दी गई?
- 4. Haml में मर्ज किए गए टेबल हेडर
- 5. लुआ
- 6. लुआ
- 7. लुआ - अंतर्राष्ट्रीयकरण कैसे करें?
- 8. लुआ
- 9. लुआ?
- 10. अपनी कुंजी से लुआ टेबल एंट्री कैसे निकालें?
- 11. मैं लुआ से सी ++ में एक टेबल कैसे पास करूं?
- 12. एनएसआईएस - मॉड्यूल मर्ज करें
- 13. संघर्ष समाधान मर्ज करें
- 14. दस्तावेजों को मर्ज करें
- 15. लुआ
- 16. लुआ
- 17. लुआ
- 18. लुआ
- 19. लुआ
- 20. लुआ
- 21. लुआ
- 22. लुआ
- 23. लुआ
- 24. लुआ
- 25. लुआ
- 26. लुआ
- 27. लुआ: एक टेबल में कैसे दिखें जहां चाबियाँ टेबल (या ऑब्जेक्ट्स)
- 28. एक लुआ समारोह स्टोर करें?
- 29. लुआ: एक वेबपृष्ठ प्राप्त करें
- 30. दो HTML तालिका कक्षों को मर्ज करें
ऐसा करने का कोई भी तरीका नहीं है । क्या आप तालिका में चाबियाँ या मानों की तुलना कर रहे हैं? क्या चाबियाँ/मानों के लिए अन्य टेबल होना संभव है? ... –
मुझे किसी भी प्रकार की तुलना की आवश्यकता नहीं है लेकिन मुझे उप-सारणी की आवश्यकता होगी ... – RCIX