2016-09-29 65 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);