79

特定のアイテムが両方にある場合は、2つのテーブルをマージし、2番目のコンテンツを最初のテーブルに上書きする必要があります。私は見ましたが、標準ライブラリはこれを提供していないようです。そのような関数はどこで入手できますか?

4

9 に答える 9

112
for k,v in pairs(second_table) do first_table[k] = v end
于 2009-08-16T03:29:24.670 に答える
19

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
于 2009-08-16T06:26:35.867 に答える
13

これは正しく機能しませんか?


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
于 2011-09-19T12:16:48.397 に答える
7

数値インデックステーブルのマージの場合:

for k,v in pairs(secondTable) do table.insert(firstTable, v) end
于 2016-03-22T04:07:02.003 に答える
4

Doug Currieの答えは、ほとんどの場合最も簡単です。テーブルのより堅牢なマージが必要な場合は、 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
-- }
于 2014-05-27T14:03:28.313 に答える
3

再帰的なスタックオーバーフローの可能性が気に入らないため、ディープマージの反復バージョンを次に示します。

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
于 2012-12-17T16:29:54.487 に答える
3

私はその単純さのために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つのライナーに圧縮することもできます:)

于 2015-03-18T22:09:17.853 に答える
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
于 2021-01-06T17:25:24.930 に答える
0
for k,v in pairs(t2) do t1[k] = v end

文字列ソリューションのキー

于 2015-11-05T10:10:56.497 に答える