2016-11-17 126 views
1

我有兩個數組通過散列值添加散列和排序的陣列

arrayOne = [{:name=>"name1", :id=>1}, {:name=>"name2", :id=>2}, {:name=>"name3", :id=>3}] 

arrayTwo = [{:name=>"name2.1", :id=>1}, {:name=>"name2.2", :id=>2}, {:name=>"name2.3", :id=>3}] 

而且我想趨於平坦,這兩個數組排序成一個大陣,所以我想這

@bigArray = [arrayOne, arrayTwo].flatten.sort {|a,b| a.name <=> b.name} 

然而,這不起作用。我是新來的鐵軌,我不確定上述flatten.sort應該映射? 有沒有更好的方法來做到這一點?

+1

定義 「不工作」 –

+0

你爲什麼要重新分配'arrayOne'? –

+1

同時使用'a [:name] <=> b [:name]' –

回答

2
(arrayOne + arrayTwo).sort_by { |e| e[:name] } 
#=> [{:name=>"name2.1", :id=>1}, 
# {:name=>"name2.1", :id=>1}, 
# {:name=>"name2.2", :id=>2}, 
# {:name=>"name2.2", :id=>2}, 
# {:name=>"name2.3", :id=>3}, 
# {:name=>"name2.3", :id=>3}] 
+0

繁榮!作品將在9分鐘內接受 –

1

首先,紅寶石語法來訪問散列成員是hash[key]而非hash.key

其次,由於arrayOnearrayTwo都是數組,因此您可以對它們使用+運算符,然後進行排序。沒有必要製作一箇中間陣列,然後進行平坦化。

把它寫成:

bigArray = (arrayOne + arrayTwo).sort_by { |el| el[:name] } 
+0

我看到改變bigArray以反映[:name] <=> b [:name]的作品,但我喜歡(arrayOne + arrayTwo).sort_by {| e | e [:name]}在理解方面更好,來自php對我來說很有意義 –