JavaScript數(shù)組的快速克隆(slice()函數(shù))和數(shù)組的排序、亂序和搜索(sort()函數(shù))
更新時間:2006年12月29日 00:00:00 作者:
JavaScript中對變量的操作都是通過引用方式,而對數(shù)組也一樣。
前兩天想要對一個數(shù)組進行復(fù)制,一直苦于找不到辦法(遍歷的方法俺是絕對不采用的)
無意中拿起《JavaScript權(quán)威指南》翻了翻數(shù)組的操作函數(shù),發(fā)現(xiàn)了slice()函數(shù)。
slice()原來是用來截取數(shù)組中的一部分,這里我用它來復(fù)制數(shù)組,它的格式如下:
array.slice(start, end)
如果省略了end參數(shù),則切分的數(shù)組包含從start開始到數(shù)組結(jié)束的所有元素。
現(xiàn)在要用它來復(fù)制數(shù)組,就一行,呵呵:
var newArray=oldArray.slice(0);
所有這些功能,用一個sort()就可以完成了。
1. 排序:
默認的sort()按字符編碼排序的:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
現(xiàn)在要讓它按照數(shù)值大小排序:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
只要傳遞一個比較函數(shù)給sort就可以了,如果比較函數(shù)的值小于0,則表示a必須出現(xiàn)在b前面,否則在b后面。
2. 亂序:
讓比較函數(shù)隨機傳回-1或1就可以了:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
3. 搜索:
用sort()來玩搜索還蠻新鮮的,呵呵,看看是怎么玩的吧。
我現(xiàn)在要把數(shù)組里含有字母'a'的元素全部找出來,如果沒有sort(),似乎只能用遍歷了,遍歷的效率…那個叫恐怖?。?!具體做法如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這樣就把數(shù)組中含有字母'a'的元素全部放到數(shù)組前面啦,再經(jīng)過一些簡單的處理,就可以輸出搜索結(jié)果了。
用slice來拷貝數(shù)組的確是一個很好的方法,而且實際上用得也會比較多,不過效率和遍歷相比很難說優(yōu)劣,因為我們誰也不知道js的slice是怎么實現(xiàn)的,不過推測起來應(yīng)該要高效一些,更重要的是寫起來簡單多了。
第二個排序的方法確實很巧妙,這樣就不用自己寫洗牌算法了 ^^
至于第三個嘛...如果不用正則,一定要用Sort的話,一樣是寫起來簡單很多,不過效率可能不見得比遍歷高,要知道遍歷并不意味著效率低,線性表單向搜索的遍歷算法是O(N)復(fù)雜度的,Js的sort我猜用得是q-sort算法(如果用冒泡的話那就太寒酸了吧^^),所以起碼是O(N*LogN)復(fù)雜度的(排序比搜索復(fù)雜也很容易理解),也就是說執(zhí)行效率上用Sort匹配基本上肯定是要不如用直接的遍歷來得快的。
數(shù)組拷貝我習(xí)慣用concat。如: newArr = oldArr.concat(),效率和slice(0)一樣。
我測試過,slice或concat拷貝數(shù)組要比遍歷快得多。
測試過程中我還發(fā)現(xiàn)另外一個特點,一個數(shù)組通過下標(biāo)取值時,似乎也是通過類似遍歷的的方法取值的。比方說數(shù)組arr有100萬個數(shù)組元素,那么這兩個表達式:i = arr[0] 和 i = arr[999999] 相比,前者會更快的取到值?。ㄈ绻恍趴梢宰约喝ゾ巶€相關(guān)例子試試看)。也就是說當(dāng)遍歷數(shù)組時,每次取值的所需時間會隨著下標(biāo)值的增加而增大。
前兩天想要對一個數(shù)組進行復(fù)制,一直苦于找不到辦法(遍歷的方法俺是絕對不采用的)
無意中拿起《JavaScript權(quán)威指南》翻了翻數(shù)組的操作函數(shù),發(fā)現(xiàn)了slice()函數(shù)。
slice()原來是用來截取數(shù)組中的一部分,這里我用它來復(fù)制數(shù)組,它的格式如下:
array.slice(start, end)
如果省略了end參數(shù),則切分的數(shù)組包含從start開始到數(shù)組結(jié)束的所有元素。
現(xiàn)在要用它來復(fù)制數(shù)組,就一行,呵呵:
var newArray=oldArray.slice(0);
所有這些功能,用一個sort()就可以完成了。
1. 排序:
默認的sort()按字符編碼排序的:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
現(xiàn)在要讓它按照數(shù)值大小排序:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
只要傳遞一個比較函數(shù)給sort就可以了,如果比較函數(shù)的值小于0,則表示a必須出現(xiàn)在b前面,否則在b后面。
2. 亂序:
讓比較函數(shù)隨機傳回-1或1就可以了:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
3. 搜索:
用sort()來玩搜索還蠻新鮮的,呵呵,看看是怎么玩的吧。
我現(xiàn)在要把數(shù)組里含有字母'a'的元素全部找出來,如果沒有sort(),似乎只能用遍歷了,遍歷的效率…那個叫恐怖?。?!具體做法如下:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
這樣就把數(shù)組中含有字母'a'的元素全部放到數(shù)組前面啦,再經(jīng)過一些簡單的處理,就可以輸出搜索結(jié)果了。
用slice來拷貝數(shù)組的確是一個很好的方法,而且實際上用得也會比較多,不過效率和遍歷相比很難說優(yōu)劣,因為我們誰也不知道js的slice是怎么實現(xiàn)的,不過推測起來應(yīng)該要高效一些,更重要的是寫起來簡單多了。
第二個排序的方法確實很巧妙,這樣就不用自己寫洗牌算法了 ^^
至于第三個嘛...如果不用正則,一定要用Sort的話,一樣是寫起來簡單很多,不過效率可能不見得比遍歷高,要知道遍歷并不意味著效率低,線性表單向搜索的遍歷算法是O(N)復(fù)雜度的,Js的sort我猜用得是q-sort算法(如果用冒泡的話那就太寒酸了吧^^),所以起碼是O(N*LogN)復(fù)雜度的(排序比搜索復(fù)雜也很容易理解),也就是說執(zhí)行效率上用Sort匹配基本上肯定是要不如用直接的遍歷來得快的。
數(shù)組拷貝我習(xí)慣用concat。如: newArr = oldArr.concat(),效率和slice(0)一樣。
我測試過,slice或concat拷貝數(shù)組要比遍歷快得多。
測試過程中我還發(fā)現(xiàn)另外一個特點,一個數(shù)組通過下標(biāo)取值時,似乎也是通過類似遍歷的的方法取值的。比方說數(shù)組arr有100萬個數(shù)組元素,那么這兩個表達式:i = arr[0] 和 i = arr[999999] 相比,前者會更快的取到值?。ㄈ绻恍趴梢宰约喝ゾ巶€相關(guān)例子試試看)。也就是說當(dāng)遍歷數(shù)組時,每次取值的所需時間會隨著下標(biāo)值的增加而增大。
相關(guān)文章
JavaScript CSS 修改學(xué)習(xí)第四章 透明度設(shè)置
今天我打算使用一些元素的透明度設(shè)置來實現(xiàn)淡出淡入效果。但是有些瀏覽器對于某些元素的透明度設(shè)置支持不夠。而且要設(shè)置表格的透明度,幾乎在所有的瀏覽器里面都不可能。2010-02-02Javascript學(xué)習(xí)筆記之 函數(shù)篇(二) : this 的工作機制
與其他編程語言相比,Javascript 對 this 的使用是一套完全不同的機制。this 在五種情況下的值是各有不同的。2014-06-06