Lua – таблицы слияния?

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

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() из библиотеки Penlight .

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

Я предпочел версию Джеймса для своей простоты и использовал ее в своем 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 

Спасибо за эту приятную функцию, которая должна быть частью classа таблицы, чтобы вы могли вызвать a:merge(b) но выполнение table.merge = function(a, b) ... не сработало для меня. Может быть даже сжат в один лайнер для настоящих ботаников 🙂

 for k,v in pairs(t2) do t1[k] = v end 

ключ для решения строки

  • R ggplot2 объединяется с данными шейп-файла и csv для заполнения полигонов
  • Можем ли мы импортировать XML-файл в другой файл XML?
  • Как добавить строки в кадр данных R
  • Объединение двух списков в Haskell
  • как слить 2 List с удалением повторяющихся значений в C #
  • объединение большого списка объектов xts
  • WinMerge и Diffmerge
  • JPA EntityManager: зачем использовать persist () над merge ()?
  • Как объединить два репозитория Git?
  • Объединение нескольких текстовых документов в один Open Xml
  • Одновременно слияние нескольких кадров данных в списке
  • Давайте будем гением компьютера.