集合类对象的遍历处理办法

 
Titlemap reduce select reject group_by each collect inject

1. map:

针对每个element进行变换并返回整个修改后的map

 

例如有这样一个字符串: a = %w(a b cD)
   a.map do |item|
      item.upcase
    end
a.map(&:upcase) 一样的效果, &:代表了item, 太简洁了,但格式难记。

2. reduce(缩小,蒸发):

把array变换为一个值后返回。

a.reduce(:+) #=> "abcD"

 

 

(5..10).reduce(0) do |sum, value|
   sum + value
end
注 : 等于 (5..10).reduce(:+)
reduct(0)里面的0是代表sum的初始值

3. select(挑选):

根据条件返回一个子集

(1..8).select { |x| x % 2 == 0 } #=> [2, 4, 6, 8]

4. reject:(排斥)

根据条件剔除一个子集  

(1..8).reject { |x| x % 2 == 0 } #=> [1, 3, 5, 7]

5. group_by:(分组依据)

根据条件组成Map

langs.group_by { |lang| lang[0] } #=> {"r"=>["ruby"], "p"=>["python", "perl"]}

 

 

a=%w(chenxiao chenmin chensiheng xiaochen liyulong)
a.group_by{|item| item.index("chen") != nil}
false=>["liyulong"], true=>["chenxiao", "chenmin", "chensiheng", "xiaochen"]

each

连续访问集合的所有元素


collect

从集合中获得各个元素传递给block,block返回的结果生成新的集合。

b=(1..10).to_a
b.collect { |x|  [x,x+x] }

map——-同collect。

b.map { |x|  [x,x+x] }

inject(注入)

遍历集合中的各个元素,将各个元素累积成返回一个值。

b.inject { |sun,val| sum+val }

array转换成hash

1.                 hash = [[:first_name'Shane'], [:last_name'Harvie']].inject({}) do |result, element|  

2.                   result[element.first] = element.last  

3.                   result  

4.                 end  

5.                   

6.                 hash # => {:first_name=>"Shane", :last_name=>"Harvie"}  

 

对一数组元素进行过滤并进行一些加工

 

1.             [1, 2, 3, 4, 5, 6].select { |element| element % 2 == 0 }.collect { |element| element.to_s } # => ["2", "4", "6"]  

 

上面代码实现选取数组中的偶数,并把它们转换成字符型。用inject如何实现呢? 

 

 

1.             array = [1, 2, 3, 4, 5, 6].inject([]) do |result, element|  

2.               result << element.to_s if element % 2 == 0  

3.               result  

4.             end  

5.               

6.             array # => ["2", "4", "6"]  

 

是不是更直观? 

 

 

 

 


posted @ 2015-11-08 21:51  怒杀神  阅读(396)  评论(0编辑  收藏  举报