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)文章
每日十條JavaScript經(jīng)驗(yàn)技巧(二)
本文是每日十條JavaScript經(jīng)驗(yàn)技巧系列文章的第二篇,同樣給大家匯總介紹10條個(gè)人在項(xiàng)目中的一些經(jīng)驗(yàn),分享給大家,希望大家能夠喜歡2016-06-06
JavaScript高級(jí)程序設(shè)計(jì)(第3版)學(xué)習(xí)筆記7 js函數(shù)(上)
如果說(shuō)對(duì)象是房間,那么函數(shù)就是有魔幻效應(yīng)的房間了。函數(shù)首先是對(duì)象,然后這個(gè)函數(shù)對(duì)象還具有很多魔幻功能2012-10-10
JavaScript 學(xué)習(xí)筆記(十六) js事件
事件對(duì)象里包含三個(gè)方面的信息····回看上一篇內(nèi)容!事件對(duì)象里的屬性和方法,主要是鼠標(biāo)和鍵盤(pán)的信息。2010-02-02
基于js 字符串indexof與search方法的區(qū)別(詳解)
下面小編就為大家分享一篇基于js 字符串indexof與search方法的區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
JavaScript onclick 和 click 的區(qū)別詳解
onclick是綁定事件,click本身是方法作用是觸發(fā)onclick事件,只要執(zhí)行了元素的click()方法,本片文章講的很詳細(xì),大家可以看看,希望能夠給你帶來(lái)幫助2021-10-10
JavaScript 學(xué)習(xí)筆記(十二) dom
新的一章的學(xué)習(xí)----Dom,重點(diǎn)啊2010-01-01

