2つのテーブルをマージする必要があります.2つ目のテーブルの内容を上書きする必要があります。私は見ましたが、標準ライブラリはこれを提供していないようです。どこでそのような機能を得ることができますか?Lua - テーブルをマージしますか?
答えて
は、ここで私はダグ・クリーの回答に基づいて思い付いたものです:
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
はい、RCIXの元の投稿を見ると、いくつかの異なるロジックがあり、後で2つの同じ 'else'ステートメントに単純化されました。あなたがここにいるものにさらに単純化されているはずです。 – BMitch
私はあなたの答えの簡潔さが好きです、ありがとう。 –
ここでは、再帰的なスタックオーバーフローの可能性が低いため、深いマージのための反復バージョンです。
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
ダグ・カリーの答えは、ほとんどの場合最も簡単です。より堅牢なテーブルのマージが必要な場合は、Penlightライブラリのmerge()
メソッドの使用を検討してください。
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
3番目のパラメータBTWとは何ですか? –
3番目のパラメータは、表がどのようにマージされるかを決定します。共用体の場合は「true」、交差部の場合は「false」です。 https://github.com/stevedonovan/Penlight/blob/master/lua/pl/tablex.lua#L554 – Blackcoat
シンプルでわかりやすく、私のutils.luaで使用することをお勧めしました。エラー処理のためにテーブルタイプのチェックを追加しました。あなたがa:merge(b)
を呼び出すことができますがtable.merge = function(a, b) ...
を行うことは私のために動作しませんでしたので、テーブルクラスの一部である必要があり、この素敵な機能のための
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
感謝。でも数値インデックステーブルのマージの文字列ソリューション
for k,v in pairs(t2) do t1[k] = v end
キーの1つのライナーに圧縮することができる:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
のために本物のオタク:)
- 1. テーブルからLua C APIテーブルを作成
- 2. LuaからCへのLuaネストしたテーブル
- 3. Luaテーブルのメモリリーク?
- 4. テーブルLuaのマージテーブル
- 5. 私はLUAでこのテーブルを持っているLuaのテーブル
- 6. テーブルLUAでテーブルの検索
- 7. Lua Ldocテーブルのドキュメント
- 8. C++/Lua FFIを使用して、ユーザーデータをテーブルとして表示しますか?
- 9. のLua:自身の中にテーブル値を取得します
- 10. いくつかのLuaテーブルを小さなデータベースに保管しますか?
- 11. Accessで2つのテーブルをマージしていますか?
- 12. Luaの多次元テーブル呼び出し
- 13. Luaの挿入テーブル値
- 14. Luaのテーブルの構文は
- 15. Luaテーブルにキーペアを挿入する
- 16. 私のルアコードにメモリリークがありますか? (LUAテーブル)
- 17. Luaネストしたテーブル内のテーブルの値を処理中
- 18. 一般的なLuaランタイムはテーブル参照を最適化しますか?
- 19. Lua table.getn()は0を返しますか?
- 20. Lua:コンテキストをloadstringに渡しますか?
- 21. テーブルからのマージSQL行
- 22. テーブルをマージする - EXCEL
- 23. テーブルの行をマージする
- 24. SASテーブルのマージ
- 25. SQLテーブルのマージ
- 26. Pythonに相当するLuaのテーブル
- 27. リッチテキストをマージしますか?
- 28. Luaのテーブル長演算子はどのように機能しますか?
- 29. Luaのテーブルまたはメタテーブルの "タイプ"を比較できますか?
- 30. Luaのテーブルを回転させる?
これを行うための単一の方法はありません。あなたはテーブルのキーや値を比較していますか?キー/値が別のテーブルになる可能性はありますか?... –
私は比較をする必要はありませんが、サブテーブルが必要になります... – RCIX