【问题标题】:Creating a mapping of letter frequencies in str in Javascript在 Javascript 中创建 str 中字母频率的映射
【发布时间】:2014-10-20 02:54:57
【问题描述】:

大家好,我想创建一个函数,它接收一个字符串并返回一个对象,该对象具有字符串中字母频率的映射。此外,我希望我的函数以降序返回按频率排序的对象。所以我期待的是letterfreq("ssabbb") => {b:3,s:2,a:1}。我写了一个返回频率映射的函数,这个函数是

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 问题的一部分。

【问题讨论】:

  • 对象是内部的哈希图,不能排序。

标签: javascript sorting object


【解决方案1】:

看看这个,因为你不能对一个对象进行排序,我们把这个对象变成一个数组。

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]

【讨论】:

  • 如何将其转回哈希表?
  • 您可以,但不再保证订单。
猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多