Entfernen Sie während der Iteration sicher Elemente aus einer Array-Tabelle

Diese Frage ähneltWie kann ich eine Lua-Tabelle sicher durchlaufen, während Schlüssel entfernt werden? aber deutlich anders.

Zusammenfassung

Gegeben ein Lua - Array (Tabelle mit Schlüsseln, die sequentielle ganze Zahlen sind, beginnend mit1), was ist der beste Weg, um durch dieses Array zu iterierenund löschen Sie einige der Einträge so, wie sie angezeigt werden?

Beispiel aus der realen Welt

Ich habe ein Array von zeitgestempelten Einträgen in einer Lua-Array-Tabelle. Einträge werden immer am Ende des Arrays eingefügt (mittable.insert).

local timestampedEvents = {}
function addEvent( data )
  table.insert( timestampedEvents, {getCurrentTime(),data} )
end

Ich muss diese Tabelle gelegentlich (in der angegebenen Reihenfolge) durchgehen und bestimmte Einträge verarbeiten und entfernen:

function processEventsBefore( timestamp )
  for i,stamp in ipairs( timestampedEvents ) do
    if stamp[1] <= timestamp then
      processEventData( stamp[2] )
      table.remove( timestampedEvents, i )
    end
  end
end

Leider unterbricht der obige Code die Iteration und überspringt einige Einträge. Gibt es eine bessere (weniger tippende, aber dennoch sichere) Möglichkeit, dies zu tun, als die Indizes manuell zu durchlaufen:

function processEventsBefore( timestamp )
  local i = 1
  while i <= #timestampedEvents do -- warning: do not cache the table length
    local stamp = timestampedEvents[i]
    if stamp[1] <= timestamp then
      processEventData( stamp[2] )
      table.remove( timestampedEvents, i )
    else
      i = i + 1
    end
  end
end

Antworten auf die Frage(9)

Ihre Antwort auf die Frage