JS暴虐查找法
更新時(shí)間:2006年12月22日 00:00:00 作者:
有過相關(guān)經(jīng)驗(yàn)的朋友都知道,Jscript的效率畢竟有限,在數(shù)組中查找數(shù)據(jù)時(shí)如果用常規(guī)的算法來做執(zhí)行起來會(huì)很慢。
例如在一個(gè)含500個(gè)字符串的data數(shù)組里,我們想要找到一個(gè)指定的字符(key),返回它的數(shù)組下標(biāo),如果用這樣的算法:
[Copy to clipboard]CODE:
function usual_search(data,key)
{
var m=data.length
for(i=0;i<m;i++)
{if(data[i]==key)return i}
}
由于需要做多次的比較,運(yùn)算起來會(huì)相當(dāng)?shù)穆?
本主題要介紹的是一種充分利用Jscript內(nèi)置方法來實(shí)現(xiàn)在數(shù)組中查找數(shù)據(jù)的方法,由于借助Jscript內(nèi)置方法,其效率要遠(yuǎn)優(yōu)于上述常規(guī)算法。為了(詼諧|唬人)起見,我命其名為“JS暴虐查找法”。
這種查找法對(duì)于數(shù)組元素有一個(gè)要求:就是數(shù)組元素的內(nèi)容不得包含半角逗號(hào)(,)及我們指定的某一個(gè)代置符號(hào)(例如,在下面的示例中,我們指定代置符號(hào)為一個(gè)制表符“┢”)。在事先構(gòu)建、維護(hù)數(shù)組時(shí)要注意滿足這一要求。
JS暴虐查找法的思路是非常簡(jiǎn)單的,原則只有一個(gè),就是要“充分利用Jscript內(nèi)置方法”:
我們首先利用 Array 對(duì)象的 toString() 方法產(chǎn)生一個(gè)包含數(shù)組元素的字符串,在這個(gè)字符串中各數(shù)組元素由半角逗號(hào)(,)分隔的,所以我們事先要求數(shù)組元素的內(nèi)容不得包含半角逗號(hào)。
隨后利用 String 對(duì)象的 replace() 方法將這個(gè)字符串中所包含的我們要找的關(guān)鍵字符串替換成我們指定的一種特殊符號(hào)(代置符號(hào)),一般選擇一個(gè)不常用的字符來充當(dāng)代置符號(hào),在下面示例中我使用了一個(gè)制表符(┢),只要是能夠確保不會(huì)在數(shù)組元素中出現(xiàn)的符號(hào)都可以充當(dāng)代置符號(hào)。
接下來就是我們最暴虐的一步了,還是用 replace() 方法,去除半角逗號(hào)(,)和代置符號(hào)(┢)以外的所有字符。統(tǒng)統(tǒng)去干凈以后這個(gè)字符串就變成了一串半角逗號(hào)之中包含著一個(gè)代置符號(hào)(這模樣:,,,,,,,,,,,,,,,,┢,,,,,,,,,)。
最后,用 String 對(duì)象的 indexOf() 方法返回代置符號(hào)在這個(gè)字符串中的位置,而這個(gè)位置恰恰也就是在原來數(shù)組中的數(shù)組下標(biāo)。
Jscript示例程序
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
例如在一個(gè)含500個(gè)字符串的data數(shù)組里,我們想要找到一個(gè)指定的字符(key),返回它的數(shù)組下標(biāo),如果用這樣的算法:
[Copy to clipboard]CODE:
function usual_search(data,key)
{
var m=data.length
for(i=0;i<m;i++)
{if(data[i]==key)return i}
}
由于需要做多次的比較,運(yùn)算起來會(huì)相當(dāng)?shù)穆?
本主題要介紹的是一種充分利用Jscript內(nèi)置方法來實(shí)現(xiàn)在數(shù)組中查找數(shù)據(jù)的方法,由于借助Jscript內(nèi)置方法,其效率要遠(yuǎn)優(yōu)于上述常規(guī)算法。為了(詼諧|唬人)起見,我命其名為“JS暴虐查找法”。
這種查找法對(duì)于數(shù)組元素有一個(gè)要求:就是數(shù)組元素的內(nèi)容不得包含半角逗號(hào)(,)及我們指定的某一個(gè)代置符號(hào)(例如,在下面的示例中,我們指定代置符號(hào)為一個(gè)制表符“┢”)。在事先構(gòu)建、維護(hù)數(shù)組時(shí)要注意滿足這一要求。
JS暴虐查找法的思路是非常簡(jiǎn)單的,原則只有一個(gè),就是要“充分利用Jscript內(nèi)置方法”:
我們首先利用 Array 對(duì)象的 toString() 方法產(chǎn)生一個(gè)包含數(shù)組元素的字符串,在這個(gè)字符串中各數(shù)組元素由半角逗號(hào)(,)分隔的,所以我們事先要求數(shù)組元素的內(nèi)容不得包含半角逗號(hào)。
隨后利用 String 對(duì)象的 replace() 方法將這個(gè)字符串中所包含的我們要找的關(guān)鍵字符串替換成我們指定的一種特殊符號(hào)(代置符號(hào)),一般選擇一個(gè)不常用的字符來充當(dāng)代置符號(hào),在下面示例中我使用了一個(gè)制表符(┢),只要是能夠確保不會(huì)在數(shù)組元素中出現(xiàn)的符號(hào)都可以充當(dāng)代置符號(hào)。
接下來就是我們最暴虐的一步了,還是用 replace() 方法,去除半角逗號(hào)(,)和代置符號(hào)(┢)以外的所有字符。統(tǒng)統(tǒng)去干凈以后這個(gè)字符串就變成了一串半角逗號(hào)之中包含著一個(gè)代置符號(hào)(這模樣:,,,,,,,,,,,,,,,,┢,,,,,,,,,)。
最后,用 String 對(duì)象的 indexOf() 方法返回代置符號(hào)在這個(gè)字符串中的位置,而這個(gè)位置恰恰也就是在原來數(shù)組中的數(shù)組下標(biāo)。
Jscript示例程序
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
相關(guān)文章
Javascript入門學(xué)習(xí)資料收集整理篇
為大家更好的接觸和學(xué)習(xí)js資料,所以我轉(zhuǎn)了這篇文章,我大約的看了下,文章寫的非常不錯(cuò),希望大家不要急,慢慢看,第一次看不懂不要緊,多練習(xí)就可以了2008-07-07Javascript模塊化編程(一)模塊的寫法最佳實(shí)踐
Javascript模塊化編程,已經(jīng)成為一個(gè)迫切的需求。理想情況下,開發(fā)者只需要實(shí)現(xiàn)核心的業(yè)務(wù)邏輯,其他都可以加載別人已經(jīng)寫好的模塊但是,Javascript不是一種模塊化編程語言,它不支持類class,更遑論模塊module了2013-01-01JavaScript入門教程(6) Window窗口對(duì)象
他是JavaScript中最大的對(duì)象,它描述的是一個(gè)瀏覽器窗口。一般要引用它的屬性和方法時(shí),不需要用“window.xxx”這種形式,而直接使用“xxx”。一個(gè)框架頁(yè)面也是一個(gè)窗口。2009-01-01javascript學(xué)習(xí)筆記(五)正則表達(dá)式
正則表達(dá)式在web開發(fā)中會(huì)經(jīng)常用到,主要用于驗(yàn)證用戶輸入的數(shù)據(jù)的格式。2011-04-04ES6下javascript解構(gòu)賦值常見用法總結(jié)
這篇文章主要介紹了在ES6下javascript賦值常見用法總結(jié),需要的朋友可以參考下2022-01-01JavaScript中的正則表達(dá)式簡(jiǎn)明總結(jié)
這篇文章主要介紹了JavaScript中的正則表達(dá)式,簡(jiǎn)明總結(jié)了正則中的語法含義和RegExp對(duì)象,需要的朋友可以參考下2014-04-04