Сравнение двух таблиц

Bene //

Участник
Автор темы
128
6
Версия MoonLoader
.026-beta
Всем привет. Нужно сравнить две таблицы. Если в одной из них не будет данных как в другой, то эти данные удаляются.
Например:

local table1 = {one, two, three, four}
local table2 = {two, three, four}

Нужно их сравнить, если в table1 есть значение "one", а в table2 его нет, то тогда в table1 значение "one" должно удалиться. Как сделать так?
 
Решение
вот вариант с поддержкой произвольной вложенности таблиц, используя рекурсию:
Lua:
local table1 = {"one", {"two", "three"}, "three", "common", { {"common_table"} }, {"four", {"five", "six"}}}
local table2 = {"two", {"three", "four"}, "four", "common", { {"common_table"} }, {"five", "six"}}

-- Сравнивает два переданных значения
local function deepEqual(t1, t2)
    if type(t1) ~= type(t2) then return false end
    if type(t1) ~= "table" then return t1 == t2 end
    if #t1 ~= #t2 then return false end

    for k, v in pairs(t1) do
        if type(v) == "table" then
            if not deepEqual(v, t2[k]) then
                return false
            end
        else
            if v ~= t2[k] then
                return false
            end...

BEEZZYY

Новичок
9
0
Lua:
local table1 = {"one", "two", "three", "four"}
local table2 = {"two", "three", "four"}

-- создание новой таблицы
local new_table = {}

-- проход по элементам таблицы 1
for i = 1, #table1 do
    local element = table1[i]
    
    -- проверка наличия элемента в таблице 2
    local found = false
    for j = 1, #table2 do
        if table2[j] == element then
            found = true
            break
        end
    end
    
    -- добавление элемента в новую таблицу, если он есть и в таблице 1, и в таблице 2
    if found then
        table.insert(new_table, element)
    end
end

-- замена таблицы 1 на новую таблицу
table1 = new_table
 

Bene //

Участник
Автор темы
128
6
Lua:
local table1 = {"one", "two", "three", "four"}
local table2 = {"two", "three", "four"}

-- создание новой таблицы
local new_table = {}

-- проход по элементам таблицы 1
for i = 1, #table1 do
    local element = table1[i]
   
    -- проверка наличия элемента в таблице 2
    local found = false
    for j = 1, #table2 do
        if table2[j] == element then
            found = true
            break
        end
    end
   
    -- добавление элемента в новую таблицу, если он есть и в таблице 1, и в таблице 2
    if found then
        table.insert(new_table, element)
    end
end

-- замена таблицы 1 на новую таблицу
table1 = new_table
Нужно удалить
 

moreveal

Известный
Проверенный
928
621
вот вариант с поддержкой произвольной вложенности таблиц, используя рекурсию:
Lua:
local table1 = {"one", {"two", "three"}, "three", "common", { {"common_table"} }, {"four", {"five", "six"}}}
local table2 = {"two", {"three", "four"}, "four", "common", { {"common_table"} }, {"five", "six"}}

-- Сравнивает два переданных значения
local function deepEqual(t1, t2)
    if type(t1) ~= type(t2) then return false end
    if type(t1) ~= "table" then return t1 == t2 end
    if #t1 ~= #t2 then return false end

    for k, v in pairs(t1) do
        if type(v) == "table" then
            if not deepEqual(v, t2[k]) then
                return false
            end
        else
            if v ~= t2[k] then
                return false
            end
        end
    end

    return true
end

-- Узнает, содержит ли переданная таблица указанное значение
local function contains(tbl, val)
    for _, v in ipairs(tbl) do
        if deepEqual(v, val) then
            return true
        end
    end
    return false
end

-- Сравнивает таблицы и удаляет элементы, которые не содержатся в обоих таблицах одновременно
local function compareAndRemove(t1, t2)
    local t1_filtered = {}

    for _, value in ipairs(t1) do
        if contains(t2, value) then
            table.insert(t1_filtered, value)
        end
    end

    return t1_filtered
end

local result = compareAndRemove(table1, table2) -- result: { "common", { {"common_table"} } }
 
  • Вау
Реакции: YarikVL, qdIbp и MLycoris