2014-10-20 53 views
0

嗨,大家好我想創建一個函數,它接受一個字符串並返回一個對象,該對象具有字符串中字母頻率的映射。另外,我希望我的函數以降序的方式返回按頻率排序的對象。所以我期待的是letterfreq("ssabbb") =>{b:3,s:2,a:1}。我寫了返回頻率的映射函數,這個函數是在str中創建字母頻率的映射在Javascript中

function letterfreq(str) { 
    var mapping = {}; 
    var NoSpaceStr = str.replace(/[\s]/g,""); 
     for(var i = 0; i < NoSpaceStr.length; i++){ 
     if(!mapping[NoSpaceStr[i]]) 
      {mapping[NoSpaceStr[i]] = 0;} 
     mapping[NoSpaceStr[i]] += 1;} 
    return mapping 
} 

的問題是我有點難倒有關排序的基礎上的屬性值。我檢查了this,第一個答案有高回報的答案。他讓對象成爲數組的數組,然後繼續說:「一旦擁有數組,就可以按照您喜歡的順序從數組中重建對象,從而實現您準備完成的任務。」我不確定如何做到這一點。我想知道是否有人有一個初學者可以理解的解決方案。我發佈的鏈接中的問題的答案是有點壓倒性的。任何建議或幫助將是偉大的。謝謝!順便說一下,這是CoderByte問題的一部分。

+1

對象是內部hashmaps,他們不能訂購。 – thefourtheye 2014-10-20 02:56:25

回答

0

檢查了這一點,因爲你不能排序一個對象,我們把對象變成一個數組。

function charOccour(str) { 
    //returns object detailing characters and its count found in str 
    //case sensitive 
    var found = {}; //key is char found, and value is count of occourances in str 
    for (var i=0; i<str.length; i++) { 
     console.log('on char = ', str[i]); 
     if(str[i] in found) { 
      unique = false; 
      found[str[i]]++; 
     } else { 
      found[str[i]] = 1; 
     } 
    } 
    return found; 
} 

var ret = charOccour('blah blah'); //Object { b: 2, l: 2, a: 2, h: 2, : 1 } 
//turn ret to array and sort it 

var arr = []; 
for (var letter in ret) { 
    arr.push([letter, ret[letter]]) 
}; 
console.log(arr.toString()); 

arr.sort(function(a, b) { 
    return a[1] < b[1]; 
}); 
//['b',2], ['l',2], ['a',2], ['h',2], [' ',1] 
+0

如何將其重新轉換爲哈希表? – theamateurdataanalyst 2014-10-20 03:37:55

+0

你可以但後來訂購不再保證。 – Noitidart 2014-10-20 03:41:30