2014-10-20 54 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