假设我有一个或多个数组:
arr = [["Foo1", "Bar1", "1", "W"],
["Foo2", "Bar2", "2", "X"],
["Foo3", "Bar3", "3", "Y"],
["Foo4", "Bar4", "4", "Z"],
["Foo5", "Bar5", "5", "A"]]
有没有办法可以根据某些标准在二维数组中移动单个数组?
例如,如果内部数组的元素3是" 4",那么将它移到顶部?
所以上面的arr
看起来像是:
[["Foo4", "Bar4", "4", "Z"],
["Foo1", "Bar1", "1", "W"],
["Foo2", "Bar2", "2", "X"],
["Foo3", "Bar3", "3", "Y"],
["Foo5", "Bar5", "5", "A"]]
我尝试过尝试选择内部数组:
arr.map {|row| row.select {|i| i[3] == "4"} }
答案 0 :(得分:2)
你当然可以。最简单的方法是首先找到匹配,如果存在则将其移动到所需的位置。
index = arr.index{|i| i[2] == '4' }
arr.insert(0, arr.delete_at(index)) if index
请记住,数组中的索引是基于0的,因此如果要检查数组中的第三个元素,则要查看索引2。
答案 1 :(得分:0)
最通用的方式可能是使用Array#sort
:
▶ criteria = ->(arr) { arr[2] == "4" }
#⇒ #<Proc:0x005570424c2568@(pry):8 (lambda)>
▶ arr.sort do |e1, e2|
▷ criteria.(e1) ? -1 : criteria.(e2) ? 1 : e1 <=> e2
▷ end
#⇒ [["Foo4", "Bar4", "4", "Z"],
# ["Foo1", "Bar1", "1", "W"],
# ["Foo2", "Bar2", "2", "X"],
# ["Foo3", "Bar3", "3", "Y"],
# ["Foo5", "Bar5", "5", "A"]]
这样您就可以根据需要更新criteria
,一切都会正常工作。
或者,更明确地保留原始订单(@StefanPochmann的信用):
arr.sort_by.with_index { |e, i| [criteria[e] ? 0 : 1, i] }
答案 2 :(得分:0)
换句话说,如果要移动多个内部数组,也可以使用
arr.partition { |e| e[2] == '4' }.sum([])