Я пытаюсь изменить массив, удаляя значения, которые соответствуют уникальному идентификатору, но затем останавливаюсь, как только первые 5 значений массива являются действительными (т.е. их идентификаторы не совпадают с нежелательными).Если массив имеет число <= 5, то этого достаточно: </p>
all_items = [{"id" => "id01"},{"id" => "id02"},{"id" => "id03"},{"id" => "id04"}]
exclude_ids = ["id01","id02"]
all_items.delete_if { |item| exclude_ids.include?(item["id"])}
и желаемый результат равен [{"id" => "id03"},{"id" => "id04"}]
.
Но в случае, когда общее количество массивов равно> = 5, я хочу удалить только столько первых элементов, сколько необходимо, до тех пор, пока первые 5 элементов (all_items[0..4]
) не будут действительными в пределах установленного критерия, а затем прекратить итерации.Если бы я сделал это:
all_items = [{"id" => "id01"},{"id" => "id02"},{"id" => "id03"},{"id" => "id04"},{"id" => "id05"},{"id" => "id06"},{"id" => "id07"},{"id" => "id08"},{"id" => "id09"},{"id" => "id10"}]
exclude_ids = ["id01","id02","id07"]
all_items.delete_if { |item| exclude_ids.include?(item["id"])}
return all_items[0..4]
Я бы получил желаемый результат, [{"id" => "id03"},{"id" => "id04"},{"id" => "id05"},{"id" => "id06"},{"id" => "id08"}]
.Но я хочу, чтобы delete_if
полностью остановился, как только он достигнет точки, где all_items[0..4]
уже содержит 5 допустимых элементов.В этом случае я бы хотел, чтобы он ломался после {"id" => "id08"}
, и даже не проверял оставшиеся значения.(Однако, если во время работы delete_if
общее число падает ниже 5, то оно должно продолжать перебирать все оставшиеся элементы, так как оно попадет в категорию первого фрагмента кода, который я разместил выше, где счетчик<= 5.) </p>
Я знаю, что есть delete_if.with_index
, но я не уверен, подходит ли он в этом контексте, тем более что индекс будет смещаться при удалении элементов.
Подводя итог моему вопросу: есть ли способ удалить столько первых элементов из массива, сколько требуется, до тех пор, пока array[0..x]
не заполнится желаемыми значениями, а затем прекратить проверку / удаление любых оставшихся элементов после того, как это числох достигнут?