js常會問的問題:找出字符串中出現次數最多的字符。


一、循環obj

let testStr = 'asdasddsfdsfadsfdghdadsdfdgdasd';
        function getMax(str) {
            let obj = {};
            for(let i in str) {
                if(obj[str[i]]) {
                    obj[str[i]]++;
                }else{
                    obj[str[i]] = 1;
                }
            }
            let keys = Object.keys(obj); // 獲取對象中所有key的值返回數組
            let values = Object.values(obj); // 獲取所有value返回數組
            let maxVal = Math.max(...values);// Math.max可以找出傳入參數的最大值,如:Math.max(1,2);這里可使用es6中的解構,
        也可以使用Math.max.apply(Math,values)可認為是apply(Math.max, arr)
        然后,arr是一個參數列表,對於max方法,其參數是若干個數,即Math.max(a, b, c, d, ...)
console.log(keys[values.indexOf(maxVal)],maxVal); } getMax(testStr); // obj值:{a: 5, s: 7, d: 12, f: 4, g: 2, h: 1, s: 7,}




// 很牛的reduce方法

var testStr = 'asdasddsfdsfadsfdghdadsdfdgdasd';
var testArray = testStr.split('');
var a = testArray.reduce(function(prev,next){
  if(next in prev) {
    prev[next]++;
  }else {
    prev[next] = 1;
  }
  return prev
},{})
console.log(a)

 

 

keys[values.indexOf(maxVal)] => value里面最大的數字的位置,最大數字位置對應的key。
maxVal最大的數,也就是出現做多的次數。
str[i]是對應字符串中的第i個字符,
obj[str[i]] 就是對應的每個字母
for循環就是
把里面出現了的字母作為obj這個對象的key,然后循環的時候判斷obj里面有沒有以str[i]為key的對象,如有,就把它的value加一,說明這個字母在obj中出現的次數多了一次;剛開始i是鍵名,str[i]是鍵值,用這個鍵值再做obj的鍵名,然后賦值,或累加

eg:
obj[str[i]] = 1; => var obj={};obj.aa = 1;console.log(obj)

二、正則
let stringMax = (str) => {
            str = str.split('').sort().join('');
            var s = str.match(/(\w+)(\1)/g);
            if(s === null) {
                return str[0];
            }
            s = s.map(e => e=e+e[0]);
            var out = s.sort((a,b) =>b.length - a.length);
            console.log(out[0][0],out[0].length);
        };
        stringMax(testStr)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM