JavaScript數組的快速複製(slice()函數)和數組的排序、亂序和搜尋(sort()函數)

來源:互聯網
上載者:User

JavaScript中對變數的操作都是通過引用方式,而對數組也一樣。
前兩天想要對一個數組進行複製,一直苦於找不到辦法(遍曆的方法俺是絕對不採用的)

無意中拿起《JavaScript權威指南》翻了翻數組的操作函數,發現了slice()函數。

slice()原來是用來截取數組中的一部分,這裡我用它來複製數組,它的格式如下:
array.slice(start, end)
如果省略了end參數,則切分的數組包含從start開始到數組結束的所有元素。

現在要用它來複製數組,就一行,呵呵:
var newArray=oldArray.slice(0);

所有這些功能,用一個sort()就可以完成了。

1. 排序:
預設的sort()按字元編碼排序的:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

現在要讓它按照數值大小排序:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

只要傳遞一個比較函數給sort就可以了,如果比較函數的值小於0,則表示a必須出現在b前面,否則在b後面。
2. 亂序:
讓比較函數隨機傳回-1或1就可以了:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

3. 搜尋:
用sort()來玩搜尋還蠻新鮮的,呵呵,看看是怎麼玩的吧。
我現在要把數組裡含有字母'a'的元素全部找出來,如果沒有sort(),似乎只能用遍曆了,遍曆的效率…那個叫恐怖啊!!具體做法如下:
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

這樣就把數組中含有字母'a'的元素全部放到數組前面啦,再經過一些簡單的處理,就可以輸出搜尋結果了。
用slice來拷貝數組的確是一個很好的方法,而且實際上用得也會比較多,不過效率和遍曆相比很難說優劣,因為我們誰也不知道js的slice是怎麼實現的,不過推測起來應該要高效一些,更重要的是寫起來簡單多了。

第二個排序的方法確實很巧妙,這樣就不用自己寫洗牌演算法了 ^^

至於第三個嘛...如果不用正則,一定要用Sort的話,一樣是寫起來簡單很多,不過效率可能不見得比遍曆高,要知道遍曆並不意味著效率低,線性表單向搜尋的遍曆演算法是O(N)複雜度的,Js的sort我猜用得是q-sort演算法(如果用冒泡的話那就太寒酸了吧^^),所以起碼是O(N*LogN)複雜度的(排序比搜尋複雜也很容易理解),也就是說執行效率上用Sort匹配基本上肯定是要不如用直接的遍曆來得快的。
數組拷貝我習慣用concat。如: newArr = oldArr.concat(),效率和slice(0)一樣。

我測試過,slice或concat拷貝數組要比遍曆快得多。
測試過程中我還發現另外一個特點,一個數組通過下標取值時,似乎也是通過類似遍曆的的方法取值的。比方說數組arr有100萬個數組元素,那麼這兩個運算式:i = arr[0] 和 i = arr[999999] 相比,前者會更快的取到值!(如果不信可以自己去編個相關例子試試看)。也就是說當遍曆數組時,每次取值的所需時間會隨著下標值的增加而增大。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.