js 中基礎資料結構陣列去重問題

cayley的程式設計之路發表於2019-02-27

本文寫於1年前 曾經的學習文章如今拿出來分享

引言

一說到資料結構,很多人就開始頭大了,因為總感覺像什麼資料結構,演算法之類的概念都很高大上,我知道有很多的同學都是畢業後覺得程式設計高薪,亦或培訓速成所以就選擇了一門語言,從而從事了這個行業,但是對於程式語言的一些基礎,以及相關的系列知識結構其實是缺失的,所以業餘時間多花點功夫多學習,其實都是可以補上來的,拿我自己舉例子吧,我學的專業雖然不是“電腦科學與技術”也不是“軟體工程”這樣純計算機的專業,但是是和計算機專業相關的學科,所以上學的時候,接觸過C,Java,C#等語言,也有一些資料結構的概念,資料庫操作也略知一二,也系列的學過計算機網路基礎等課程,雖然上學的時候學的不好也不精,但至少的思想和概念是有的,所以在此也給一些剛剛入技術,或者轉行的同學一點提示,除了本職的技術語言和繁忙的業務邏輯之外,這些基礎概念還是應該要補上來的。

一.什麼是資料結構

資料結構是一種儲存和組織資料的方式

至於我是什麼時候有了關於“資料結構”這個概念,應該是2016的7月份起,加入了目前的公司,接觸複雜的業務邏輯,處理複雜的資料,公司有專門的幾十人團隊的大資料部門,所以可想而知,每次處理介面返回過來的資料,不再是以前單一結構的資料,而是相對比較複雜,設計合理的介面資料,那麼這個時候你直接拿到資料,並不是可以直接使用的,它需要你做二次處理之後才能用了展示或者處理邏輯用的資料

舉個栗子

比如我們獲取到了一段這樣的資料,但是臨時我們需要往資料中再加一個欄位,比如需要給每一項加一個“country"這個欄位,因此我們就需要將這組資料進行一個處理,陣列是最簡單的記憶體資料結構,js中以及幾乎所有的語言都支援陣列型別,所以學好js中的資料結構,首先要學習的就是對陣列的處理

js 中基礎資料結構陣列去重問題

一些資料片段

javascript語言一直不斷的完善和更新,去年有了es6,今年又有了es7,陣列中涉及的方法和API也是在不斷的完善,本文不介紹es5之後的方法擴充套件,需要的同學請檢視相關的資料學習,先來概覽一下常用的可以高效處理陣列的方法,這些方法可以在日常工作中幫我們處理很多簡單的邏輯

處理資料時常用的:具有遍歷作用的方法

forEach(),map(), some()/every(), filter(),reduce()/reduceRight()方法都具有一個遍歷作用,但是它們在遍歷的同時還具有其特定的功能,以上這幾個方法是我在處理陣列資料時常用的方法,之前沒有使用過或者使用不全的同學可以去搜尋一下它們各自的功能

二.陣列去重

思考?如何去除陣列中重複的項

例如陣列:[1,3,4,3,5]我們在做去重的時候,一開始想到的肯定是,逐個比較,外面一層迴圈,內層後一個與前一個一比較,如果是久不將當前這一項放進新的陣列,挨個比較完之後返回一個新的去過重複的陣列

js 中基礎資料結構陣列去重問題

不好的實踐方式

上述方法效率極低,程式碼量還多,思考?有沒有更好的方法

這時候不禁一想當然有了!!!hashtable 啊,通過物件的hash辦法可以有效的去除掉重複的內容

js 中基礎資料結構陣列去重問題

成功輸出去重後的陣列

?既然陣列的方法都已經如此完善了,豈不是有更好的遍歷方法

js 中基礎資料結構陣列去重問題

使用forEach替代for迴圈

最後!如果陣列中重複出現的並不是簡單的資料型別,每一項都是一種複雜的物件型別的資料結構該如何去重呢?

例如陣列是這樣的:

js 中基礎資料結構陣列去重問題

第一項和最後一項重複

其實還是利用hash的思想,但是轉化一下思維,比如我們可以把這個陣列中的每一項當作一個物件的屬性也,然後列舉這個屬性

js 中基礎資料結構陣列去重問題

附上小方法

解析:上面這個方法呢利用Object.keys()這個方法列舉我們去重後的一個物件unique,這個方法返回一個屬性列表陣列,之後我們利用陣列的map()方法遍歷並且給每一項執行一個callback,map()會返回一個新的陣列

完結
以上的小栗子,由最開始我們的古老思想和低效方法逐步到最後陣列去重複雜項,這一個個過程都體現了陣列的樂趣所在,同時也體現出了資料結構的魅力之處,陣列只是一種簡單的資料結構,還有很多更復雜更有意識的知識等待我們去挖掘,也希望小夥伴可以跟我分享更多的知識和樂趣,2107年歡迎你和我一起做一個不斷努力學習的知識分子

Cayley 一個不斷努力學習的女程式設計師

相關文章