2016-11-17 129 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对我来说很有意义 –