分享幾道js面試題,本身感受仍是挺重要的,當看到題目的時候但願你們先花幾秒鐘考慮一下,
而後在看答案。若是有比較好的解法,歡迎你們留言指正,謝謝你們!面試
題目: 寫一個字符串轉換成駝峯的方法? 正則表達式
例如:border-bottom-color
-> borderBottomColor
數組
let str = "border-bottom-color"; function change(val){ // 用‘-’切分紅一個數組 let arr = val.split('-'); // 首字符大寫 for(let i = 1; i < arr.length; i++){ arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substring(1); } // 將字符串拼接後返回 return arr.join(''); }
點評: 這種方法雖然能夠實現,但仍是太LOW了,一點都不簡潔。函數
let str = "border-bottom-color"; function change(val){ return str.split('-').reduce((prev,cur,index) => { return prev + cur.charAt(0).toUpperCase()+cur.substring(1); }); }
點評: 這種方法使用了數組的 reduce() 方法,稍微簡潔了一點點,但仍是不夠好。code
let str = "border-bottom-color"; function change(val){ // 定義正則表達式 let re = /-(\w)/g; return str.replace(re,($0,$1) => { return $1.toUpperCase(); }); }
點評: 第三種方法使用正則表達式,效果仍是不錯的。對象
備註:
replace()方法的第二個參數能夠是一個函數:
參數一:$0 正則的總體 -b -c
參數二:$1 正則當中子項的第一個(用括號括起來的就叫作子項) b c
字符串
題目: 查找字符串中出現最多的字符和個數? string
例如:abbcccddddd
-> 字符最多的是d,出現了5次
it
let str = "abbcccddddd"; let obj = {}; // 生成obj對象 for(let i = 0;i < str.length; i++){ let cur = str[i]; // 當前字符 if(!obj[ cur ]){ obj[ cur ] = []; } obj[ cur ].push(cur); } // 統計次數 let num = 0; let char = ''; for(item in obj){ if(num < obj[item].length){ num = obj[item].length; char = obj[item][0]; } } console.log(`字符最多的是${char},出現了${num}次`);
點評: 雖然能實現,可是太麻煩。io
let str = "abbcccddddd"; // 生成obj let obj = str.split('').reduce((prev,cur) => { prev[cur] ? prev[cur]++ : prev[cur] = 1; return prev; },{}); // {a: 1, b: 2, c: 3, d: 5} let num = 0; let char = ''; // 統計次數 for(item in obj){ if(num < obj[item]){ num = obj[item]; char = item; } } console.log(`字符最多的是${char},出現了${num}次`);
點評: 稍微好一點。仍然是使用 reduce() 這個方法。
哈哈,萬能的 reduce 。
let str = "abcabcabcbbccccc"; let num = 0; let char = ''; // 使其按照必定的次序排列 str = str.split('').sort().join(''); // "aaabbbbbcccccccc" // 定義正則表達式 let re = /(\w)\1+/g; str.replace(re,($0,$1) => { if(num < $0.length){ num = $0.length; char = $1; } }); console.log(`字符最多的是${char},出現了${num}次`);
點評: :使用正則表達式老是那麼簡單。
題目: 如何給字符串加千分符?
例如:42342342342
-> 42,342,342,342
let str = "12312345678988"; // 轉換的方法 function change(str){ // 轉化爲數組 var arr = str.split(''); var result = []; while(arr.length > 3){ result.push(arr.splice(-3,3).join('')); } result.push(arr.join('')); // 最終的結果 return result.reverse().join(','); }
點評: :將字符串轉化爲數組,而後對其切分重組。
let str = "12312345678988"; function change(str){ // 僅僅對位置進行匹配 let re = /(?=(?!\b)(\d{3})+$)/g; return str.replace(re,','); }
點評: :這個正則表達式就有點屌了。
(?=) : 前向聲明
(?!) : 反前向聲明
舉個小栗子
var str = 'abacad'; var re = /a(?=b)/g; str.replace(re,'*'); // 結果:'*bacad' // 將a後邊爲‘b’的a替換爲‘*’號 var re = /a(?!b)/g; str.replace(re,'*'); // 結果:'ab*c*d' // 將a後邊不爲‘b’的a替換爲‘*’號