? ? ? JS學(xué)習(xí)過(guò)程中寇漫,知識(shí)點(diǎn)很多很零碎腋颠,但是總有一些經(jīng)典的算法問(wèn)題出現(xiàn)在工作涮坐、學(xué)習(xí)之中。典型的問(wèn)題當(dāng)你找工作的時(shí)候是有很大的可能碰到的映屋。
? ? ? ?當(dāng)然雖說(shuō)我們很多時(shí)候前端很少有機(jī)會(huì)接觸到算法苟鸯。大多都交互性的操作,然而從各大公司面試來(lái)看棚点,算法依舊是考察的一方面早处。實(shí)際上學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法對(duì)于工程師去理解和分析問(wèn)題都是有幫助的。如果將來(lái)當(dāng)我們面對(duì)較為復(fù)雜的問(wèn)題瘫析,這些基礎(chǔ)知識(shí)的積累可以幫助我們更好的優(yōu)化解決思路砌梆。
比如:
找出元素 item 在給定數(shù)組 arr 中的位置
輸出描述:
如果數(shù)組中存在 item,則返回元素在數(shù)組中的位置颁股,否則返回 -1
(function(){var?
indexOf([ 1, 2, 3, 4 ], 3)
輸出例子:
2
這是一個(gè)基礎(chǔ)的查找數(shù)組元素位置的問(wèn)題么库,看到這個(gè)問(wèn)題,可大家首先會(huì)聯(lián)想到indexOf屬性甘有,W3C里的定義:
indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置诉儒。
stringObject(字符串).indexOf(searchvalue(必需。規(guī)定需檢索的字符串值亏掀。),fromindex(可選的整數(shù)參數(shù)忱反。規(guī)定在字符串中開(kāi)始檢索的位置泛释。它的合法取值是 0 到 stringObject.length - 1。如省略該參數(shù)温算,則將從字符串的首字符開(kāi)始檢索怜校。))
例子:let str = 'orange';
str.indexOf('o'); //0
str.indexOf('n'); //3
str.indexOf('c'); //-1
那么問(wèn)題來(lái)了,number類(lèi)型有沒(méi)有 indexOf 方法嗎注竿?明確告訴大家沒(méi)有茄茁,上例子:
? ? ? ? ? ? ? let num = 2016;
? ? ? ? ? ? ? ?num.indexOf(2);
當(dāng)然這也沒(méi)什么,只需要把數(shù)字轉(zhuǎn)換成字符串就好了:
num.toString().indexOf(2);//0
最后巩割,回到本文的重點(diǎn)裙顽,對(duì)于數(shù)組(Arrary),有沒(méi)有indexOf方法嗎宣谈?
let arr = ['orange', '2016', '2016'];
arr.indexOf('orange'); //0
arr.indexOf('o'); //-1
arr.indexOf('2016'); //1
arr.indexOf(2016); //-1
定義了一個(gè)數(shù)組['orange', '2016', '2016']愈犹,
arr.indexOf(‘orange') 輸出 0 因?yàn)?‘orange' 是數(shù)組的第 0 個(gè)元素,匹配到并返回下標(biāo)闻丑。
arr.indexOf(‘o') 輸出 -1 因?yàn)榇朔椒ú粫?huì)在每一個(gè)元素的基礎(chǔ)上再次執(zhí)行 indexOf 匹配漩怎。
arr.indexOf(‘2016') 輸出 1 因?yàn)榇朔椒◤念^匹配直到匹配到時(shí)返回第一個(gè)數(shù)組元素的下表,而不是返回全部匹配的下標(biāo)嗦嗡。
arr.indexOf(2016) 輸出 -1 注意:這里不會(huì)做隱式類(lèi)型轉(zhuǎn)換勋锤。
既然indexOf對(duì)數(shù)組有效,那么這個(gè)問(wèn)題我們自然而然的可以這樣解決:
function indexOf(arr,item){
return arr.indexOf(item)
}
運(yùn)行結(jié)果:
但是問(wèn)題又來(lái)了,既然考你算法知識(shí)卑硫,這道題目就不能僅僅調(diào)用既有方法來(lái)解決徒恋,我們可以自己編寫(xiě)一個(gè)函數(shù)來(lái)解決這個(gè)問(wèn)題, 這是網(wǎng)上一個(gè)好評(píng)比較多的方法:
functionindexOf(arr,item) {
if(Array.prototype.indexOf){
returnarr.indexOf(item);
}else{
for(vari =0;i < arr.length;i++) {
if(arr[i] === item) {
returni;
}
}
}
return-1;
}
console.log(indexOf([1,2,3,3,3],3))
運(yùn)行結(jié)果:
可以看到,這段代碼先會(huì)使用.prototype屬性(prototype 屬性使您有能力向?qū)ο筇砑訉傩院头椒ǎ?/b>,因?yàn)閕e8以下的瀏覽器不支持.indexOf這個(gè)功能虎忌,所以自然也不能添加,此時(shí)采用一個(gè)for循環(huán):依此判斷item是否與數(shù)組里的元素相同径筏,并返回i的值。如果沒(méi)有找到障陶,按照indexOf的語(yǔ)法規(guī)則滋恬,則返回-1,注意的是抱究,return-1要寫(xiě)在函數(shù)的最外面恢氯,因?yàn)椴徽撌遣捎眉扔蟹椒ㄟ€是一個(gè)for循環(huán),如果沒(méi)有找到item,最終都會(huì)返回-1的值勋拟,當(dāng)然寫(xiě)在else里面也可以勋磕,知識(shí)我覺(jué)得這樣結(jié)構(gòu)稍顯不清晰,大家覺(jué)得呢敢靡。