Lua добавление и фильтрация элементов в таблице - PullRequest
1 голос
/ 13 июня 2019

Я пишу дополнение WoW, которое будет отслеживать и фильтровать список элементов.

Добавлены элементы, которых еще нет в списке; элементы, которые уже перечислены, не должны добавляться.

Проблема, с которой я сталкиваюсь, заключается в том, что моя функция проверки не всегда предотвращает добавление дубликатов в список.

Добавление элемента A в первый раз работает нормально, попытка добавить его снова, если он был добавлен последним, корректно не добавляется.

Добавление элемента B в первый раз работает нормально, попытка добавить его снова, если он был добавлен последним, корректно не добавляется.

Проблема в том, что если я пытаюсь повторно добавить элемент A, когда он не был добавлен последним, он неправильно повторно добавляет элемент в список; по сути, я могу повторно добавлять элементы, если они не были последними элементами для добавления.

Вот изображение, которое показывает вам, что происходит;

А вот и две мои функции.

Я также связал свой полный код lua здесь и токен здесь .

-- check if item is already listed
local function isItemOnList(incomingItemID)
    for k, v in pairs(AAAGlobalItemLinkList) do
        if v.itemID == incomingItemID then
            print(v.itemID, ':matched:', incomingItemID)
            return true
        end
        print('no match', incomingItemID)
        return false
    end
end
-- add item link to list function
local function addItemLinkToList()
    local cursorItemType, cursorItemID, cursorItemLink = GetCursorInfo()
    print(cursorItemID)
    if not isItemOnList(cursorItemID) then
        local itemName,
            itemLink,
            itemRarity,
            itemLevel,
            itemMinLevel,
            itemType,
            itemSubType,
            itemStackCount,
            itemEquipLoc,
            iconFileDataID,
            itemSellPrice,
            itemClassID,
            itemSubClassID,
            bindType,
            expacID,
            itemSetID,
            isCraftingReagent = GetItemInfo(cursorItemID)
        tempItemList = {
            itemID = cursorItemID,
            itemName = itemName,
            itemLink = itemLink,
            itemRarity = itemRarity,
            itemLevel = itemLevel,
            itemMinLevel = itemMinLevel,
            itemType = itemType,
            itemSubType = itemSubType,
            itemStackCount = itemStackCount,
            itemEquipLoc = itemEquipLoc,
            iconFileDataID = iconFileDataID,
            itemSellPrice = itemSellPrice,
            itemClassID = itemClassID,
            itemSubClassID = itemSubClassID,
            bindType = bindType,
            expacID = expacID,
            itemSetID = itemSetID,
            isCraftingReagent = isCraftingReagent
        }
        table.insert(AAAGlobalItemLinkList, 1, tempItemList)
        print(cursorItemLink, 'added to list')
    else
        print(cursorItemLink, 'already listed')
    end
    updateScrollFrame()
    ClearCursor()
end
-- update scroll frames function
local function updateScrollFrame()
    wipe(listItems)
    for index = 1, #AAAGlobalItemLinkList do
        --if testItemRarity(AAAGlobalItemLinkList[index]) then
        table.insert(listItems, AAAGlobalItemLinkList[index]['itemLink'])
        --end
    end
    FauxScrollFrame_Update(testingScrollFrame, #listItems, NumberOfButtons, HeightOfButtons)
    for index = 1, NumberOfButtons do
        local offset = index + FauxScrollFrame_GetOffset(testingScrollFrame)
        local button = testingScrollFrame.buttons[index]
        if index > #listItems then
            button:SetText('')a
            button.index = nil
        else
            button.index = offset
            --local itemName, itemLink = GetItemInfo(listItems[offset])
            button:SetText(listItems[offset])
        end
    end
end

Я не получаю никаких ошибок.

Я также связал свой полный код lua здесь и ток здесь.

Надеюсь, кто-то может объяснить, как я все испортил, а также может указать мне правильное направление, чтобы исправить это.

1 Ответ

1 голос
/ 14 июня 2019

в вашей функции isItemOnList вы возвращаете false внутри цикла for, поэтому цикл не может выполняться более 1 итерации. Вы должны поместить return false вне for цикла:

-- check if item is already listed
local function isItemOnList(incomingItemID)
    for k, v in pairs(AAAGlobalItemLinkList) do
        if v.itemID == incomingItemID then
            print(v.itemID, ':matched:', incomingItemID)
            return true
        end
    end
    print('no match', incomingItemID)
    return false
end

также можно обойтись без возврата, поэтому nil будет возвращено по умолчанию, а для if чеки nil совпадают с false

...