所以我有這個數組:從陣列中的紅寶石
['One', 'Two', 'One', 'One', 'Three', 'Three', 'One']
我想要得到這樣的結果:
['One', 'Two', 'One', 'Three', 'One']
所以我想刪除的項目是一樣的上一個項目。 如何在Ruby中做到這一點?
所以我有這個數組:從陣列中的紅寶石
['One', 'Two', 'One', 'One', 'Three', 'Three', 'One']
我想要得到這樣的結果:
['One', 'Two', 'One', 'Three', 'One']
所以我想刪除的項目是一樣的上一個項目。 如何在Ruby中做到這一點?
ary = ['One', 'Two', 'One', 'One', 'Three', 'Three', 'One']
ary.chunk {|x| x }.map(&:first)
#=> ["One", "Two", "One", "Three", "One"]
可枚舉#塊列舉過的項目,基於塊的返回值分塊在一起。將返回相同塊值的連續元素分塊在一起。
ary.chunk {|x| x }.to_a
=> [["One", ["One"]],
["Two", ["Two"]],
["One", ["One", "One"]],
["Three", ["Three", "Three"]],
["One", ["One"]]]
map(&:first)
Array#map迭代陣列調用陣列
&:first
的每個元件上的first
法在被稱爲symbol to proc
它創建一個進程內對象,該陣列的每個元素映射屈服於
所以上面的例子可以改寫爲:
lambda_obj = ->(ele) { ele.first }
ary.chunk {|x| x }.map(&lambda_obj)
#=> ["One", "Two", "One", "Three", "One"]
與inject
很簡單:
ary.inject [] do |accum,x|
accum.last == x ? accum : accum << x
end
很好,沒有花哨的技巧,我實際上可以從這段代碼中讀取邏輯。謝謝!我喜歡你的無私。但總的來說,我認爲塊是這項工作的正確功能...... –
在這種情況下,我們也可以使用'#each_with_object':'ary.each_with_object [] do | e,a | a << e除非a.last == e end'。 –
+1 @BorisStitnicky給你..我總是喜歡'each_with_object'。 –
你的答案是第一,它是做什麼的,我需要的,我想這是真的很大。但是很難閱讀並理解塊之後的映射邏輯,能否請你解釋一下地圖部分? –
哦......這不太可讀......你怎麼看待roippi的不夠? –
@BrazhnykYuriy你有沒有通過我的解釋 – bjhaid