詳解JS去重及字符串奇數(shù)位小寫轉(zhuǎn)大寫
面試中經(jīng)常會(huì)考到數(shù)組的去重。作為一名合格的前端開發(fā)者,不知道幾種去重方法是在不應(yīng)該。廢話不多說直接開擼……
一、indexOf()方法
實(shí)現(xiàn)思路:使用indexOf()方法來判斷新數(shù)組中是否有這個(gè)值,若沒有則將這個(gè)值push到數(shù)組中
//先定義一個(gè)數(shù)組 var arr = [,'','',,,,,,,,]; function remov(array) { var arr=[]; for (var i=,len=array.length;i<len;i++){ if (arr.indexOf(array[i])==-){ arr.push(array[i]) } } return arr; } console.log(remov(arr));//[, "", "", , , , , , , ]
代碼很簡(jiǎn)單,說明一點(diǎn)indexOf()是ES5中的方法,不兼容IE8一下,所以用之前考慮下兼容性問題。
二、sort()+判斷相鄰兩個(gè)數(shù)
實(shí)現(xiàn)思路:先使用數(shù)組的sort()方法將數(shù)組升序排序,再判斷相鄰的兩個(gè)數(shù)是否相等,若不相等則將前面的數(shù)push到新創(chuàng)建的數(shù)組中
var arr = [,'','',,,,,,,,]; function remov(array) { var linArr = []; array.sort(); for (var i = , len = array.length; i < len; i++) { if (array[i + ] !== array[i]) { linArr.push(array[i]) } } return linArr; } console.log(remov(arr));//["", , , , , "", , , , ]
三、創(chuàng)建一個(gè)空對(duì)象和一個(gè)空數(shù)組
實(shí)現(xiàn)思路:for循環(huán)中判斷對(duì)象中是否有當(dāng)前項(xiàng),若沒有則將當(dāng)前項(xiàng)push到新創(chuàng)建的數(shù)組中,同時(shí)將當(dāng)前項(xiàng)作為對(duì)象的一個(gè)屬性賦值為1
var arr = [,'','',,,,,,,,]; function remov(array) { var res = []; var obj={}; for (var i=;i<array.length;i++){ if(!obj[array[i]]){ res.push(array[i]); obj[array[i]]=; } } return res; } console.log(remov(arr));//[, "", "", , , , , , ]
至于這里為什么將當(dāng)前項(xiàng)作為對(duì)象的一個(gè)屬性賦值為1,比如說數(shù)組中的5,第一次對(duì)象中沒有5這個(gè)屬性,我們將其push到新數(shù)組中,若不對(duì)5這個(gè)屬性進(jìn)行賦值,下次檢測(cè)到第二個(gè)5時(shí)對(duì)象中同樣沒有又要將其push到新數(shù)組中。所以這里將當(dāng)前項(xiàng)作為對(duì)象的一個(gè)屬性賦值為1,當(dāng)然也可以賦值為其他值。說的有點(diǎn)啰嗦,懂得人可以略過……
大家有咩有注意到第三種方法的字符串'4'與數(shù)值4這里判斷不了,有點(diǎn)小缺憾吧。
四、這種方法與第三種方法借鑒的第三種方法
實(shí)現(xiàn)思路:for循環(huán)中判斷對(duì)象中是否有當(dāng)前項(xiàng),若沒有則將當(dāng)前項(xiàng)作為對(duì)象的一個(gè)屬性賦值為1,否則當(dāng)前項(xiàng)++。在for循環(huán)完畢后再用for in遍歷對(duì)象中的屬性
var arr = [,'','',,,,,,,,]; function remov(array) { var obj = {}; var res = []; for (var i=;i<array.length;i++){ if(!obj[array[i]]){ obj[array[i]]=; }else{ obj[array[i]]++; } } for (var k in obj){ res.push(k);//b.這里將遍歷的對(duì)象屬性push到新創(chuàng)建的數(shù)組中 // console.log(k);//a.直接將遍歷的對(duì)象的屬性打印出來 } return res;//b.這里返回新創(chuàng)建的數(shù)組 } console.log(remov(arr));//b.這里將remov(arr)函數(shù)的執(zhí)行結(jié)果打印出來["", "", "", "", "", "", "", "", ""] // remov(arr);//a
這種方法有個(gè)小疑問:注釋里面有a的是將遍歷的對(duì)象屬性直接打印出來結(jié)果如下圖
注釋里面的b是將遍歷的對(duì)象的屬性push到新創(chuàng)建的數(shù)組中,結(jié)果打印出來的數(shù)組中都是字符串。
五、兩個(gè)for循環(huán)來遍歷
實(shí)現(xiàn)思路:這種方法因該是用的比較多的吧,創(chuàng)建一個(gè)空數(shù)組,第一次for循環(huán)中將一個(gè)數(shù)組值存到變量item中,在第二次for循環(huán)中將新建數(shù)組的值與變量比較,若相等則break,第二個(gè)for循環(huán)完畢后再判斷新建數(shù)組的長度是否與第二個(gè)循環(huán)中的j變量相等,若相等則將第一次循環(huán)中的item添加到新建的數(shù)組中
var arr = [,'','',,,,,,,,]; function remov(array) { var res = []; for (var i=,len=array.length;i<len;i++){ var item = array[i]; for (var j=;j<res.length;j++){ if (res[j]==item){ break; } } if (res.length==j){ res.push(item); } } return res; } console.log(remov(arr));//[, "", "", , , , , , ]
當(dāng)然還有很多其他的數(shù)組去重方法,這里就整理了這么多,有錯(cuò)誤或不當(dāng)之處請(qǐng)指出,大家共同探討學(xué)習(xí)。
補(bǔ)充一道面試題:
題目描述:對(duì)輸入的一串字符串從1開始順序編號(hào),如果遇到奇數(shù)的小寫英文字母,則轉(zhuǎn)換成對(duì)應(yīng)的大寫字母.若遇到非英文字母字符,不計(jì)入奇偶數(shù),但結(jié)果要保留該字符
var str = 'sdt$^uygGTdgabN'; document.write(str+"<br/>");//將原字符串輸出到文檔 var j=,reg=/[a-zA-Z]/;//j變量用于計(jì)數(shù)、定義一個(gè)正則表達(dá)式用來判斷是否是字母 var sArr = str.split("");//將字符串轉(zhuǎn)換成數(shù)組 for (var i=;i<sArr.length;i++){ if(reg.test(sArr[i])){//如果是字母j++ j+=; if (j%==){//如果是奇數(shù)將當(dāng)前項(xiàng)轉(zhuǎn)換成大寫 sArr[i] = sArr[i].toUpperCase(); } } } str = sArr.join('');//將數(shù)組轉(zhuǎn)換成字符串 document.write(str);//將轉(zhuǎn)換后的字符串輸出到文檔
附上轉(zhuǎn)換前與轉(zhuǎn)換后的字符串對(duì)比圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JS實(shí)現(xiàn)字符串去重及數(shù)組去重的方法示例
- JS實(shí)現(xiàn)的字符串?dāng)?shù)組去重功能小結(jié)
- js字符串去重復(fù)id的實(shí)現(xiàn)代碼
- javascript 實(shí)現(xiàn)字符串反轉(zhuǎn)的三種方法
- javascript 不用reverse實(shí)現(xiàn)字符串反轉(zhuǎn)的代碼
- 字符串反轉(zhuǎn)_JavaScript
- 一個(gè)JavaScript遞歸實(shí)現(xiàn)反轉(zhuǎn)數(shù)組字符串的實(shí)例
- JavaScript實(shí)現(xiàn)反轉(zhuǎn)字符串的方法詳解
- javascript實(shí)現(xiàn)字符串反轉(zhuǎn)的方法
- JS算法教程之字符串去重與字符串反轉(zhuǎn)
相關(guān)文章
js運(yùn)動(dòng)動(dòng)畫的八個(gè)知識(shí)點(diǎn)
本文給大家分享的是個(gè)人在學(xué)習(xí)js運(yùn)動(dòng)動(dòng)畫的過程中總結(jié)的我們需要注意的8個(gè)知識(shí)點(diǎn),分別是速度動(dòng)畫、透明度漸變、緩沖運(yùn)動(dòng)、多物體運(yùn)動(dòng)、獲取樣式、任意屬性值、鏈?zhǔn)竭\(yùn)動(dòng)和同時(shí)運(yùn)動(dòng),非常的詳細(xì),推薦給小伙伴們。2015-03-03淺談JavaScript暫時(shí)性死區(qū)與垃圾回收機(jī)制
本文主要介紹了淺談JavaScript暫時(shí)性死區(qū)與垃圾回收機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05js檢測(cè)網(wǎng)絡(luò)是否具體連接功能的代碼
這篇文章主要介紹了js如何實(shí)現(xiàn)檢測(cè)網(wǎng)絡(luò)是否具體連接功能 ,需要的朋友可以參考下2014-05-05JavaScript 事件流、事件處理程序及事件對(duì)象總結(jié)
JS與HTML之間的交互通過事件實(shí)現(xiàn),事件就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間,可以使用(或處理程序)來預(yù)定事件,以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼,本文將介紹JS事件相關(guān)的基礎(chǔ)知識(shí),2017-04-04javascript HTML+CSS實(shí)現(xiàn)經(jīng)典橙色導(dǎo)航菜單
這篇文章主要介紹了javascript HTML+CSS實(shí)現(xiàn)經(jīng)典橙色導(dǎo)航菜單的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-02-02基于JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06JS限制input框只能輸入0~100的正整數(shù)的兩種方法
本文給大家分享兩種方法實(shí)現(xiàn)JS限制input框只能輸入0~100的正整數(shù),方法二是直接通過設(shè)置三個(gè)屬性,type、min、max即可,就可以設(shè)置0~100的整數(shù),感興趣的朋友跟隨小編一起看看吧2024-02-02