문제

주어진 항목이 둘 모두에있는 경우 첫 번째 덮어 쓰기 내용의 내용과 함께 두 테이블을 병합해야합니다. 나는 보았지만 표준 라이브러리는 이것을 제공하지 않는 것 같습니다. 그런 기능을 어디서 구할 수 있습니까?

도움이 되었습니까?

해결책

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

Doug Currie의 답변은 대부분의 경우 가장 간단합니다. 더 강력한 테이블 병합이 필요한 경우 사용을 고려하십시오. merge() .의 방법 펜 라이트 도서관.

require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))

-- {
--   a = 1,
--   d = 4,
--   c = 3,
--   b = 2
-- }

단순성을 위해 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

문자열 솔루션의 키

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top