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