特定のアイテムが両方にある場合は、2つのテーブルをマージし、2番目のコンテンツを最初のテーブルに上書きする必要があります。私は見ましたが、標準ライブラリはこれを提供していないようです。そのような関数はどこで入手できますか?
9 に答える
for k,v in pairs(second_table) do first_table[k] = v end
DougCurrieの回答に基づいて私が思いついたものは次のとおりです。
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
私はその単純さのために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) ...
もうまくいきませんでした。実際のオタクのために1つのライナーに圧縮することもできます:)
Doug Currieが言ったように、彼の関数を使用することはできますが、彼の方法には問題があります。first_table
インデックスに何かがある場合k
、関数はそれを上書きします。
インデックスと値を上書きするのではなく、これらのテーブルをマージしようとしていると想定しています。これが私の方法です。非常に似ていますが、テーブルのマージに使用されます。
for _, v in pairs(second_table) do table.insert(first_table, v) end
このソリューションの唯一の問題は、インデックスが文字列ではなく数値として設定されることです。これは、インデックスとして数値を使用するテーブルで機能します。インデックスとして文字列を使用するテーブルの場合は、DougCurrieの方法を使用します。
ダグカリーの方法:
for k,v in pairs(second_table) do first_table[k] = v end
for k,v in pairs(t2) do t1[k] = v end
文字列ソリューションのキー