Вопрос

Мне нужно объединить две таблицы, причем содержимое второй перезаписывает содержимое в первой, если данный элемент есть в обеих.Я посмотрел, но стандартные библиотеки, похоже, этого не предлагают.Где я могу получить такую функцию?

Это было полезно?

Решение

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

Другие советы

Вот что я придумал, основываясь на ответе Дуга Карри:

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

Вот итеративная версия для глубокого слияния, потому что мне не нравятся потенциальные рекурсивные переполнения стека.

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() метод из Фонарик для ручки библиотека.

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

Спасибо за эту приятную функцию, которая должна быть частью класса table, чтобы вы могли вызывать 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