Potrzebuję scalić dwie tabele, z treścią drugiej nadpisującej zawartość w pierwszej, jeśli dany element jest w obu. Wyglądałem, ale standardowe biblioteki nie wydają się tego oferować. Gdzie mogę uzyskać taką funkcję?Lua - scalić tabele?
Odpowiedz
Oto co wymyśliłem na podstawie odpowiedzi Doug Currie za:
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
Zauważ, że zwykle zły pomysł na bałagan ze standardowymi "przestrzeniami nazw Lua" (jak na przykład tabela. *). Lepiej tworzyć własne. –
"jeśli nie t1 [k] to t1 [k] = {} koniec" zawiera subtelny błąd (znajdź to!) Lepiej zapisz go jako "t1 [k] = t1 [k] lub {}". Co się stanie, jeśli t2 [k] jest tabelą, ale t1 [k] istnieje, ale nie jest tabelą? Wreszcie "table1 [k] = v" powinno być "t1 [k] = v". – lhf
Wszystkie dobre punkty, naprawię je natychmiast. – RCIX
nie to będzie działać poprawnie?
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
Tak, ale jeśli spojrzysz na oryginalny post RCIX-a, istniała tam inna logika, która została później uproszczona do dwóch identycznych instrukcji "else". Powinno to zostać jeszcze bardziej uproszczone do tego, co tu masz. – BMitch
Podoba mi się zwięzłość odpowiedzi, dzięki. –
Oto iteracyjna wersja do głębokiego scalania, ponieważ nie podoba mi się potencjalne przepełnienie stosu rekursywne.
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
Zapomniałeś sprawdzić, czy 'merge_task' przepełnia twoją dostępną pamięć ... – Irfy
@Irfy, wiesz, że nie możesz tego zrobić w Lua, prawda? –
Mój komentarz został oznaczony jako sarkazm: jeśli unikniesz rekursji, ponieważ boisz się/oczekujesz przepełnienia stosu; a następnie nie sprawdzaj, czy twój kontener zadań przepełnia twoją pamięć, to nie ma większego sensu unikanie rekursji w pierwszej kolejności. – Irfy
Odpowiedź Douga Currie jest najprostsza w większości przypadków. Jeśli potrzebujesz bardziej niezawodnego łączenia tabel, rozważ skorzystanie z metody merge()
z biblioteki Penlight.
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
Jaki jest trzeci parametr, BTW? –
Trzeci parametr określa sposób łączenia tabel: "true" dla unii, "false" dla przecięcia. https://github.com/stevedonovan/Penlight/blob/master/lua/pl/tablex.lua#L554 – Blackcoat
Ja preferowałem wersję Jamesa ze względu na jej prostotę i używam jej w moim utils.lua - dodałem sprawdzanie typu tabeli do obsługi błędów.
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
Dzięki za ten miły funkcji, które powinny być częścią klasy tabeli tak można nazwać a:merge(b)
ale robi table.merge = function(a, b) ...
nie działa dla mnie. nawet może być skompresowany do jednej liniowej dla prawdziwych maniaków :)
for k,v in pairs(t2) do t1[k] = v end
kluczem do rozwiązania strun
stołowe numeryczny indeks przejmowanego:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
- 1. Jak scalić tabele w R?
- 2. Jak dołączyć/scalić dwie tabele używając wartości znaków?
- 3. Jak scalić dwie tabele bez nazywania wszystkich kolumn?
- 4. Jak scalić dwie tabele w jedną za pomocą mongify
- 5. Tabele przestawne/tabele EPPlus
- 6. Lua, co to jest Lua?
- 7. Kod wcięcia Lua w Lua
- 8. Słaba referencja Lua
- 9. Hibernate scalić
- 10. Lua i C++: rozdział obowiązków
- 11. Jak mogę głębiej porównać 2 tabele Lua, które mogą lub nie mają tabel jako kluczy?
- 12. Tabele transpozycji?
- 13. scalić querysets w Django
- 14. scalić dwie listy obiektów
- 15. C# podzielić i scalić?
- 16. TStringGrid scalić rysunek komórki
- 17. Gemfile.lock zawiera scalić konfliktów
- 18. jquery scalić dwa obiekty
- 19. Jak scalić wiele skrótów?
- 20. Jak scalić dwa obiekty?
- 21. Jak scalić pojedyncze zatwierdzenie?
- 22. Jak scalić plik binarny?
- 23. Cofnij git przodu scalić
- 24. Jak scalić zakresów z różnych tabel
- 25. Jak scalić dwa pliki binarne?
- 26. Uruchamianie Lua pod nginxem (pisanie strony internetowej z Lua)
- 27. Umieszczanie Lua w C+Osadzanie Lua w C++
- 28. Jak podzielić tabelę Lua zawierającą podtabeli
- 29. Jak najlepiej przeanalizować dowolny stały stół Lua bez ładowania go w maszynie wirtualnej Lua?
- 30. Przesuwanie tabeli Lua
Nie istnieje jeden sposób to zrobić . Czy porównujesz klucze lub wartości w tabeli? Czy jest możliwe, aby klucze/wartości były innymi tabelami? ... –
Nie potrzebuję żadnego porównania, ale będę potrzebował podtabeli ... – RCIX