문제
주어진 항목이 둘 모두에있는 경우 첫 번째 덮어 쓰기 내용의 내용과 함께 두 테이블을 병합해야합니다. 나는 보았지만 표준 라이브러리는 이것을 제공하지 않는 것 같습니다. 그런 기능을 어디서 구할 수 있습니까?
해결책
for k,v in pairs(second_table) do first_table[k] = v end
다른 팁
Doug Currie의 답변을 바탕으로 한 내용은 다음과 같습니다.
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
Recursive의 잠재적 스택 오버플로가 마음에 들지 않기 때문에 Deep Merge의 반복 버전은 다음과 같습니다.
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