1. 程式人生 > >Ruby 中一些好用的方法(注意reduce方法)

Ruby 中一些好用的方法(注意reduce方法)

#####inject

inject是我使用最頻繁的方法了,它的強大之處在於可以方便的對巢狀的陣列,雜湊等混合資料結構進行合併或求和, 可以有效減少程式碼量。

例如最常見的陣列套雜湊:

1
2
3
4
array = [{a:100}, {b:200}, {c:300}]

array.inject(0) { |sum, e| sum += e.values.first } #600
array.inject({}) { |sum, e| sum.merge e } #{:a=>100, :b=>200, :c=>300}
  • inject():括號中的是sum的初始值
  • sum, e: 和在前,陣列元素在後,中間必須以逗號隔開

#####group_by

group_by適用於對於陣列和hash的分組. 在stackoverflow,我經常遇到這樣的問題:

array根據相同的school_id進行分組

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
array =  [{"school_id"=>"1",
		  "plan_type"=>"All",
		  "view"=>"true",
		  "create"=>"true",
		  "approve"=>"true",
		  "grant"=>"true",
		  "region_id"
=>nil}, {"school_id"=>"1", "plan_type"=>"All", "edit"=>"true", "region_id"=>nil}, {"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}] array.group_by { |e| e["school_id"] } => {"1"=>[{"school_id"
=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil}, {"school_id"=>"1", "plan_type"=>"All", "edit"=>"true", "region_id"=>nil}], "2"=>[{"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]}

多條件分組:

1
2
array.group_by { |e| [e["school_id"], e["plan_type"]] } #將多個條件放在陣列當中
=> {["1", "All"]=>[{"school_id"=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil}, {"school_id"=>"1", "plan_type"=>"All", "edit"=>"true", "region_id"=>nil}], ["2", "All"]=>[{"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]}

####reduce

reduce作用和inject優點類似,但是它比inject還要簡潔

1
2
3
(5..10).inject {|sum, n| sum + n }  # 45
(5..10).reduce(:+)  # 45
(5..10).reduce(1, :+)  # 46 (括號中第一個引數是初始值,第二個是方法名)

group_by中的array為例,將相同school_id的hash進行合併

1
2
array.group_by { |e| e["school_id"] }.values.map { |i| i.inject({}) { |sum ,e| sum.merge e }}
=> [{"school_id"=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil, "edit"=>"true"}, {"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]

可以使用inject將hash合併,但是使用reduce效果會更好

1
2
array.group_by { |e| e["school_id"] }.values.map { |i| i.reduce(:merge) }
=> [{"school_id"=>"1", "plan_type"=>"All", "view"=>"true", "create"=>"true", "approve"=>"true", "grant"=>"true", "region_id"=>nil, "edit"=>"true"}, {"school_id"=>"2", "plan_type"=>"All", "edit"=>"true", "grant"=>"true", "region_id"=>nil}]

####zip

zip可以將兩個數組合併為一個二維陣列

1
2
3
4
a= [1,2,3,4,5]
b=[6,7,8,9,10]
a.zip(b)
=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]

如果a.length > b.length,b中缺少的以nil代替 ,

1
2
3
4
a=[1,2,3,4,5,6]
b=[6,7,8,9,10]
a.zip(b)
=> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10], [6, nil]]

如果a.length < b.length,b中多餘的直接被丟棄

1
2
3
4
a= [1,2,3,4]
b=[6,7,8,9,10]
a.zip(b)
=> [[1, 6], [2, 7], [3, 8], [4, 9]]

相關推薦

Ruby 一些方法(注意reduce方法)

#####inject inject是我使用最頻繁的方法了,它的強大之處在於可以方便的對巢狀的陣列,雜湊等混合資料結構進行合併或求和, 可以有效減少程式碼量。 例如最常見的陣列套雜湊: 1 2 3 4array = [{a:100}, {b:200}, {c:300}]

java一些經常到的小方法

1.java中如何把字元陣列轉化成字串,並以逗號分割 方法1、需要引入Apache Commons元件中的個commons-lang.jar包: String str1=StringUtils.join(ary, “,”);

遇到了mysql一些的函式或者方法

     IFNULL(欄位,空值的預設值)      如果取同一行記錄中,多個列的最大或者最小值:GREATEST(列名)   最大值 ,LEAST(列名1,列名2) 最小值      if做輸出的條件輸出,例如:select if( value in (0,-1,-2

Java、JavaWeb單元測試到的測試方法

enc nbsp 方法 hat 思維 .com java assert 可能 寫出的代碼做單元測試時,一定要記住從三個方面出發:1、成功 2、異常 3 邏輯錯誤(即沒有異常也可能程序運行出最後結果,可是呢?呵呵)。這就是在做測試時我要牢記的三個方面,同時思維要嚴謹也即做

Python有哪些的語言翻譯方法

size webkit ted mage clas lan 網上 eba splay 最近有個需求,要將幾萬條數據從日語翻譯成中文。因為數據的獲取和處理用的是python代碼,所以想先嘗試翻譯部分也用python實現。 目前網上查到的翻譯方法有百度、有道以及谷歌翻譯,下

一些的油猴腳本

油猴 腳本1、先打開https://greasyfork.org/zh-CN,根據你的瀏覽器安裝油猴版本 2、瀏覽器擴展欄會出現這個圖標,左鍵點擊,選擇管理面板->實用工具->點擊導入文件,選擇附件裏的TXT文件再打開管理面板,出現如下圖片,就是安裝成功了。一些好用的油猴腳本

轉載 一些的網站

坐標系 ron editor class mos Edito front rap www. 一些好用的網站 笛卡爾坐標系: https://www.desmos.com/ 用於找規律:http://oeis.org/ 一個數的各種性質:http://zh.numberemp

Eclipse修改SVN戶名和密碼方法

int 代碼 cati face 常用 java style ica 選項 在用eclipse的時候會經常用到SVN來進行代碼的版本控制,為了方便起見,我們會保存密碼,從此之後就不會再出現輸入或者修改用戶名和密碼的地方了,這時候想切換用戶怎麽辦,在本地操作的一種方法

一些的網站

1. Ztree                       &n

idea一些的配置(eclipse快捷鍵、自動導包、提示不區分大小寫)

讓idea的快捷鍵使用eclipse的快捷鍵 ctrl+alt+s --> Keymap --> 選擇Eclipse 注意:換成eclipse快捷鍵之後可以再設定如下的idea提示快捷鍵   alt+/ idea引數提示: ide

的瀏覽器原生方法彙總

dom設定或移除className let bodyElement = document.getElementsByTagName('body')[0]; bodyElement.classList.add('myClass1'); // body元素新增calss:myCla

python非常的資料庫管理工具dataset

dataset對於操作JSON檔案、NoSQL非常好用。 官方文件:http://dataset.readthedocs.io/en/latest/ 補充: 連線mysql資料庫: db = dataset.connect('mysql://username:[ema

一些的Android Studio 外掛

1,CodeGlance  程式碼預覽外掛,可以在程式碼的右邊預覽,實現快速定位 2,EcTranslation  劃詞翻譯,可以幫助你翻譯不懂的英文,達到解讀程式碼的意思 3,GsonFormat  Gson解析,快速生成java Bean的過程 4,  Sex

mongodb 非常的 Aggregate

mongodb 中非常好用的 Aggregate aggregate 翻譯過來是聚合的意思, 但是在實際的使用的它的體驗特別像linux中的管道, 每個管道處理完之後再把結果交個下一個管道, 你的資料就像水流, 最後通過各個管道你能夠得到你想要的資料 我們一般用Aggregate做什麼 ​ aggreg

Notepad++一些的特性 mark ~~~全面

Notepad++一些好用的特性 2014年03月22日 10:11:16 -柚子皮- 閱讀數:3230 【notepad++簡介】 Notepad++是旨在替代Windows預設的notepad而生,比notepad的功能強大很多很多。 (1)Notepad++

一些的開源監控工具彙總

監控系統是整個 IT 架構中的重中之重,小到故障排查、問題定位,大到業務預測、運營管理,都離不開監控系統,可以說一個穩定、健康的 IT 架構中必然會有一個可信賴的監控系統。 但是,難道監控就只是監控?多年來,對於監控的術語一直都有很多困惑,一些很糟糕的工具也宣稱

Ruby單元測試(Unit Test)方法

Ruby中也提供了單元測試的框架,類似Java中的JUnit,此框架在Ruby中被成為mini test。 我們先看一個例子,這個是我的原始碼: [code lang=”ruby”] require ‘json’ module PMU_INTERFACE class IUserLoginReq

一些的小工具(1)

文字類 Typora Notepad++ 有道雲筆記 txt wordpad(一般) XMind 有道詞典(神器,不過嚴格來說不屬於文字類) 簡單畫圖 mspaint 截圖 Snipaste(這個強推) PxCook MarkMan(這個一般

zsh和oh-my-zsh的一些的主題及外掛

zsh主題 zsh的預設主題為robbyrussell,用了一段時間發現並不是那麼好用,比如它不會把當前的工作路徑全部展示出來,例如現在處於路徑/home/zhu/go/src/MyProject中,此主題就只是顯示最後路徑,即MyProject,帶來了一些不

推薦一些的Chrom外掛

前言: 為什選擇chrome瀏覽器就是因為他有很多豐富的外掛可以供使用者使用,外掛社群還是比較火熱,推薦幾個好用的外掛給大家。 No1: