2016-09-14 28 views
2

这是一个样本阵列例如作为输入:排序一个数组并使其独特上的多个条件 - 红宝石

hashForAnimals = [{ 
    :animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>3}, 
    {:animalCd=>"Cow",:animalType=>"Herbivore", :sortOrder =>5}, 
    {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder =>2}, 
    {:animalCd=>"Shark",:animalType=>"Carnivore", :sortOrder =>4}, 
    {:animalCd=>"Cow",:animalType=>"Carnivore", :sortOrder =>1}, 
    {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder =>7}, 
    {:animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>6}] 

预期输出:

hashForAnimals = [{ 
    :animalCd=>"Cow", :animalType=>"Carnivore", :sortOrder =>1}, 
    {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder =>2}, 
    {:animalCd=>"Tiger",:animalType=>"Carnivore", :sortOrder =>3}, 
    {:animalCd=>"Shark",:animalType=>"Carnivore", :sortOrder =>4}, 
    :animalCd=>"Cow", :animalType=>"Herbivore", :sortOrder =>5} 
    {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder =>7}] 

我需要的基础上,对数组进行排序的排序顺序,然后我需要使数组与animalCd相同属于同一组,即animalType。

虎已经出现过一次,最小的排序顺序,但是牛在数组中出现了两次,但有不同的动物类型。

它可以通过将数组收集到多个animalType数组并将其排序并使它们唯一并合并回单个数组来完成。不过,我需要一个优雅的解决方案。我想要

示例代码:

hashForAnimals.sort!{|x,y| x[:sortOrder].to_i<=>y[:sortOrder].to_i}.group_by { |a| a[:animalType]} 

我可以将它们组合成单独的哈希值,但然后我需要让个人独特的散列,然后合并到阵列。

这是甚至可能的方式,我接近它?

回答

2

可以使用sort_by方法和uniqvalues_at

hashForAnimals.sort_by{ |a| a[:sortOrder] }.uniq{ |k| k.values_at(:animalCd, :animalType) } 


# => [{:animalCd=>"Cow", :animalType=>"Carnivore", :sortOrder=>1}, {:animalCd=>"Rabbit", :animalType=>"Herbivore", :sortOrder=>2}, {:animalCd=>"Tiger", :animalType=>"Carnivore", :sortOrder=>3}, {:animalCd=>"Shark", :animalType=>"Carnivore", :sortOrder=>4}, {:animalCd=>"Cow", :animalType=>"Herbivore", :sortOrder=>5}, {:animalCd=>"Bear", :animalType=>"Omnivore", :sortOrder=>7}] 
+0

好吧,我missunderstod你的问题。我认为现在是好的 –

+1

你用'values_at'方法尝试了我的上次更新吗? –

+0

不知道API的values_at。非常感谢您的及时回复! – user122121