Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从与值匹配的数组开头删除尽可能多的元素,直到数组达到指定大小_Arrays_Ruby - Fatal编程技术网

Arrays 从与值匹配的数组开头删除尽可能多的元素,直到数组达到指定大小

Arrays 从与值匹配的数组开头删除尽可能多的元素,直到数组达到指定大小,arrays,ruby,Arrays,Ruby,我试图通过删除与唯一ID匹配的值来修改数组,但一旦数组的前5个值有效(即它们的ID与不需要的ID不匹配),就停止。如果数组有一个计数“id03”},{“id”=>“id04”}] 但是在数组的总计数大于等于5的情况下,我只想删除必要的前5个元素,直到前5个元素(all_items[0..4])都在设置的条件内有效,然后停止迭代。如果我这样做: all_items = [{"id" => "id01"},{"id" => "id02"},{"id" => "id03"},{"id

我试图通过删除与唯一ID匹配的值来修改数组,但一旦数组的前5个值有效(即它们的ID与不需要的ID不匹配),就停止。如果数组有一个计数“id03”},{“id”=>“id04”}]

但是在数组的总计数大于等于5的情况下,我只想删除必要的前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\u if
在到达
所有项目[0..4]
已经包含5个有效元素的点时完全停止。在本例中,我希望它在
{“id”=>“id08”}
之后中断,甚至不检查其余的值。(但是,如果在运行
delete\u If
时,总计数下降到5以下,那么它应该继续迭代所有剩余的元素,因为它将属于我上面发布的第一段代码的类别,如果从原始对象中删除,则计数,最终将得到所有未删除的项。因此,因此,最好只将所需项目移动到新对象:

all_items.each_with_object([]) { |item, ary| ary << item if !exclude_ids.include?(item["id"]) and ary.size < 5 }

#=> [{"id"=>"id03"}, {"id"=>"id04"}, {"id"=>"id05"}, {"id"=>"id06"}, {"id"=>"id08"}]
所有_项。每个_与_对象([]){|项,ary | ary[{“id”=>“id03”},{“id”=>“id04”},{“id”=>“id05”},{“id”=>“id06”},{“id”=>“id08”}]
如果只需要包含
所有项目
的第一个
终止\u阈值
有效元素的数组,则可以使用以下内容:

all_items.each_with_object([]) do |e,arr|
  arr << e unless exclusions.include?(e)
  break arr if arr.size == termination_threshold
end
  #=> [3, 4, 5, 6, 8]
所有项目。每个带有对象([])的项目|
arr[3,4,5,6,8]
您可以使用来实现您想要的:

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.lazy.reject {|item| exclude_ids.include?(item['id']) }.first(5)

听起来像是
drop\u while
drop\u while
会从一开始就删除元素。如果前四个和第六个元素都有效,而你需要删除第五个元素才能运行五个呢?这是一个有趣的问题,但你授予greenie的答案并没有回答这个问题。请参阅我对这个问题的评论。这是不正确的,因为它不修改
所有\u项
。相反,它返回一个数组,其中包含
所有\u项
的前5个元素,这些元素不包含在
排除\u id
中。OP非常明确地指出,
所有\u项
的元素将被删除,直到
所有\u项
的前5个有效元素OP甚至提到了使用
delete\u if
(又称
拒绝!
,而不是
拒绝
)。我考虑使用惰性枚举器,但没有惰性的
拒绝!
。…假设
所有时间
有1000个元素,前3个元素未通过测试,下5个通过。返回
所有项目
偏移量3-7处的元素数组,并且
所有项目
保持不变。这有什么用?OP想使用
>“删除了某些元素的所有项目”
。@CarySwoveland根据返回语句,我推断OP只是删除元素,因为他想返回前五个未返回的项目,他不关心输入。此外,如果删除项目如此重要,我认为删除所有无效项目将是优先顺序,而不是优先顺序。”只是拒绝获得前五个有效项。@CarySwoveland有时重构并不只是为了优化或可读性而重新排列代码,而是在优化和提高可读性的同时确定底层需求并更改代码以匹配需求。OP问题的最后一句话是明确的,不是你回答的问题。
all_items.each_with_object([]) do |e,arr|
  arr << e unless exclusions.include?(e)
  break arr if arr.size == termination_threshold
end
  #=> [3, 4, 5, 6, 8]
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.lazy.reject {|item| exclude_ids.include?(item['id']) }.first(5)