2016-09-29 63 views
1

我一直在想出一個對這個練習的答案,但是在那裏我看不到它。我將分享練習的描述,我的代碼和最後的輸出。使用Javascript計算字符串的頻率字母

描述:

現在我們要拯救每個數組的長度最長的一個新的數組稱爲array_lengths

打開控制檯,並重新加載索引頁看到代碼的結果。

編寫一個函數charFreq(),該函數接受一個字符串並構建其中包含的字符的頻率列表。

作爲一個條件,你必須使用對象freqCounter。

將列出的頻率表示爲Javascript對象。用charFreq(「abbabcbdbabdbdbabababcbcbab」)來嘗試。

CODE:

function charFreq(string) { 
 

 
    var array_lengths = []; 
 

 
    // compute frequencies of each value 
 
    for (var i = 0; i < string.length; i++) { 
 
    value = string[i]; 
 
    if (value in array_lengths) { 
 
     array_lengths[value] ++; 
 
    } else { 
 
     array_lengths[value] = 1; 
 
    } 
 
    } 
 

 

 
    // make array from the frequency object to de-duplicate 
 
    var freqCounter = []; 
 
    for (value in array_lengths) { 
 
    freqCounter.push(value); 
 
    } 
 

 
    // sort the uniques array in descending order by frequency 
 
    function compareFrequency(a, b) { 
 
    return array_lengths[b] - array_lengths[a]; 
 
    } 
 

 
    return freqCounter.sort(compareFrequency); 
 
} 
 

 
//OUTPUT: 
 

 
// if I had it right I should get "true" from every of the following values of the function but the point is that I'm getting all false...where's the error? 
 

 
counter = charFreq("abbabcbdbabdbdbabababcbcbab"); 
 

 
console.log(counter['a'] === 7); 
 

 
console.log(counter.b === 14); 
 

 
console.log(counter['c'] === 3);

+0

字符串是一個字符串。你需要一個數組。做:arr = string.split(「」); –

+0

你的問題是你正在返回一個有序數組'freqCounter',它只包含鍵值,而不包含值。如果您立即返回array_lengths,您的代碼將是正確的。 – Marie

+0

是的,謝謝瑪麗! – Defoe

回答

4

兩個問題

  • 使用對象

    var array_lengths = {}; // object 
    
  • 返回,如果沒有排序和其它對象東西

    return array_lengths; 
    

function charFreq(string) { 
 
    var array_lengths = {}; // object 
 

 
    // compute frequencies of each value 
 
    for(var i = 0; i < string.length; i++) { 
 
     value = string[i]; 
 
     if(value in array_lengths) { 
 
      array_lengths[value]++; 
 
     } else { 
 
      array_lengths[value] = 1; 
 
     } 
 
    } 
 
    return array_lengths; 
 
} 
 

 
//OUTPUT: 
 
// if I had it right I should get "true" from every of the following values of the function but the point is that I'm getting all false...where's the error? 
 

 
counter = charFreq("abbabcbdbabdbdbabababcbcbab"); 
 
console.log(counter); 
 
console.log(counter['a'] === 7); 
 
console.log(counter.b === 14); 
 
console.log(counter['c'] === 3);

+1

感謝@NinaScholz它的工作!我幾乎在那裏,但現在我明白它好多了:) – Defoe

0

爲此,您可以使用ES6 - 使用Set通過您的字符串轉換成一個數組並通過整個事情new Set得到數組中的唯一項目

let string = 'abbabcbdbabdbdbabababcbcbab'; 
let unique = [...new Set(string)]; 
+0

我不認爲OP只想從他的字符串中選擇一組獨特的字符,他想要一個字符的頻率計數? – httpNick

+0

他們不知道怎麼用ES6來做,他們問爲什麼他們的代碼沒有工作。 – Marie

+0

是的!不過感謝Rob M! – Defoe

1

分解它。你需要迭代字符串的每個部分,對吧?將它分成一個陣列和一個對象創建爲每個元素的計數器:

var counter = {}; 
var string = "abbabcbdbabdbdbabababcbcbab"; 
var stringArray = string.split(''); 
stringArray.forEach(function(character){ 
    if(!counter.hasOwnProperty(character)){ 
    counter[character] = 0; 
    } 
    counter[character]++; 
}); 
console.log(counter); 
+0

他們的代碼已經做到了,那部分工作完美無瑕。 – Marie

0

你是usings數組作爲對象 我離開VAR freqCounter = Object.keys(array_lengths);,因爲它是從字符串的唯一的字符。但是,它在你描述的代碼中對你沒有任何幫助。

function charFreq(string) { 
 

 
    var array_lengths = {}; 
 
    var value; 
 
    // compute frequencies of each value 
 
    for (var i = 0; i < string.length; i++) { 
 
    value = string[i]; 
 
    if (value in array_lengths) { 
 
     array_lengths[value] ++; 
 
    } else { 
 
     array_lengths[value] = 1; 
 
    } 
 
    } 
 

 

 
    // make array from the frequency object to de-duplicate 
 
    var freqCounter = Object.keys(array_lengths); 
 

 
    // sort the uniques array in descending order by frequency 
 
    function compareFrequency(a, b) { 
 
    return array_lengths[b] - array_lengths[a]; 
 
    } 
 

 
    return array_lengths; 
 
} 
 

 
//OUTPUT: 
 

 
// if I had it right I should get "true" from every of the following values of the function but the point is that I'm getting all false...where's the error? 
 

 
counter = charFreq("abbabcbdbabdbdbabababcbcbab"); 
 
console.log(counter); 
 
console.log(counter['a'] === 7); 
 

 
console.log(counter.b === 14); 
 

 
console.log(counter['c'] === 3);