詳解JS去重及字符串奇數(shù)位小寫(xiě)轉(zhuǎn)大寫(xiě)
面試中經(jīng)常會(huì)考到數(shù)組的去重。作為一名合格的前端開(kāi)發(fā)者,不知道幾種去重方法是在不應(yīng)該。廢話(huà)不多說(shuō)直接開(kāi)擼……
一、indexOf()方法
實(shí)現(xiàn)思路:使用indexOf()方法來(lái)判斷新數(shù)組中是否有這個(gè)值,若沒(méi)有則將這個(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)單,說(shuō)明一點(diǎn)indexOf()是ES5中的方法,不兼容IE8一下,所以用之前考慮下兼容性問(wèn)題。
二、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),若沒(méi)有則將當(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,比如說(shuō)數(shù)組中的5,第一次對(duì)象中沒(méi)有5這個(gè)屬性,我們將其push到新數(shù)組中,若不對(duì)5這個(gè)屬性進(jìn)行賦值,下次檢測(cè)到第二個(gè)5時(shí)對(duì)象中同樣沒(méi)有又要將其push到新數(shù)組中。所以這里將當(dāng)前項(xiàng)作為對(duì)象的一個(gè)屬性賦值為1,當(dāng)然也可以賦值為其他值。說(shuō)的有點(diǎn)啰嗦,懂得人可以略過(guò)……
大家有咩有注意到第三種方法的字符串'4'與數(shù)值4這里判斷不了,有點(diǎn)小缺憾吧。
四、這種方法與第三種方法借鑒的第三種方法
實(shí)現(xiàn)思路:for循環(huán)中判斷對(duì)象中是否有當(dāng)前項(xiàng),若沒(méi)有則將當(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ì)象的屬性打印出來(lái)
}
return res;//b.這里返回新創(chuàng)建的數(shù)組
}
console.log(remov(arr));//b.這里將remov(arr)函數(shù)的執(zhí)行結(jié)果打印出來(lái)["", "", "", "", "", "", "", "", ""]
// remov(arr);//a
這種方法有個(gè)小疑問(wèn):注釋里面有a的是將遍歷的對(duì)象屬性直接打印出來(lái)結(jié)果如下圖

注釋里面的b是將遍歷的對(duì)象的屬性push到新創(chuàng)建的數(shù)組中,結(jié)果打印出來(lái)的數(shù)組中都是字符串。
五、兩個(gè)for循環(huán)來(lái)遍歷
實(shí)現(xiàn)思路:這種方法因該是用的比較多的吧,創(chuàng)建一個(gè)空數(shù)組,第一次for循環(huán)中將一個(gè)數(shù)組值存到變量item中,在第二次for循環(huán)中將新建數(shù)組的值與變量比較,若相等則break,第二個(gè)for循環(huán)完畢后再判斷新建數(shù)組的長(zhǎng)度是否與第二個(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開(kāi)始順序編號(hào),如果遇到奇數(shù)的小寫(xiě)英文字母,則轉(zhuǎn)換成對(duì)應(yīng)的大寫(xiě)字母.若遇到非英文字母字符,不計(jì)入奇偶數(shù),但結(jié)果要保留該字符
var str = 'sdt$^uygGTdgabN';
document.write(str+"<br/>");//將原字符串輸出到文檔
var j=,reg=/[a-zA-Z]/;//j變量用于計(jì)數(shù)、定義一個(gè)正則表達(dá)式用來(lái)判斷是否是字母
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)換成大寫(xiě)
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)畫(huà)的八個(gè)知識(shí)點(diǎn)
本文給大家分享的是個(gè)人在學(xué)習(xí)js運(yùn)動(dòng)動(dòng)畫(huà)的過(guò)程中總結(jié)的我們需要注意的8個(gè)知識(shí)點(diǎn),分別是速度動(dòng)畫(huà)、透明度漸變、緩沖運(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ī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
js檢測(cè)網(wǎng)絡(luò)是否具體連接功能的代碼
這篇文章主要介紹了js如何實(shí)現(xiàn)檢測(cè)網(wǎng)絡(luò)是否具體連接功能 ,需要的朋友可以參考下2014-05-05
JavaScript 事件流、事件處理程序及事件對(duì)象總結(jié)
JS與HTML之間的交互通過(guò)事件實(shí)現(xiàn),事件就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間,可以使用(或處理程序)來(lái)預(yù)定事件,以便事件發(fā)生時(shí)執(zhí)行相應(yīng)的代碼,本文將介紹JS事件相關(guān)的基礎(chǔ)知識(shí),2017-04-04
javascript 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-06
JS限制input框只能輸入0~100的正整數(shù)的兩種方法
本文給大家分享兩種方法實(shí)現(xiàn)JS限制input框只能輸入0~100的正整數(shù),方法二是直接通過(guò)設(shè)置三個(gè)屬性,type、min、max即可,就可以設(shè)置0~100的整數(shù),感興趣的朋友跟隨小編一起看看吧2024-02-02

