【问题标题】:How do I find the 2 most frequent letters in a string and return a new string with them with javascript如何在字符串中找到 2 个最常见的字母并使用 javascript 返回一个新字符串
【发布时间】:2016-11-08 18:19:29
【问题描述】:

我正在解决一个问题,要求获取一个字符串 string 并以交替的顺序返回一个新字符串,其中包含 string 中最常见的 2 个字母。

我的代码:

var word = "pponoomababaaa";
var len = word.length;

function twoLetters (word){
var arr = []
word = word.split("")
for (var i = 0; i < word.length; i++){
    if ((arr[word[i]])) arr[word[i]] += 1
    else arr[word[i]] = 1
  }
return arr  // [ p: 2, o: 3, n: 1, m: 1, a: 5, b: 2 ]
}
twoLetters(word)

这个返回的arr 的长度为0,我不明白,所以我真的不能用它做任何事情。我已经尝试将它放入一个对象中,但它仍然有同样的问题。如何让arr 等于一个键:值对,然后找到两个最高的values,然后他们将keys 以交替顺序添加到字符串中。我的代码是否朝着正确的方向前进?

【问题讨论】:

  • 使用{},而不是[]
  • 您的arr 不为空。在您的arr 中设置键后,它就变成了一个对象。
  • 请让我们知道什么对您有用并考虑接受答案,这有助于其他人在出现此类问题时了解什么是正确的解决方案

标签: javascript string loops


【解决方案1】:

如果您将数组更改为对象,它会起作用:

var word = "pponoomababaaa";
var len = word.length;

function twoLetters (word){
  var arr = {}
  word = word.split("")
  for (var i = 0; i < word.length; i++){
    if ((arr[word[i]])) arr[word[i]] += 1
    else arr[word[i]] = 1
  }
  return arr  // { p: 2, o: 3, n: 1, m: 1, a: 5, b: 2 }
}

twoLetters(word)

在 JavaScript 中,数组 ([]) 不包含键值对(嗯,可以说是:索引是键)。您要查找的数据结构是一个普通对象 ({}),它可以保存键值对。

编辑

为了澄清一点,您可以将成员添加到数组 ([]),但您的数组长度将为 0。这是我在 Chrome 中的浏览器控制台的输出,您可以在其中看到可以添加成员到数组本身。但是不推荐这种方法。

【讨论】:

  • {}[] 没有区别。
  • @Omeed2,你确定吗?
  • 是的,继续尝试,你会得到相同的结果。它正在创建一个 key:value 对象,而不是一个数组。您可以访问 arr.p 但不能访问 arr[0]
  • @Omeed2 你是对的,但它可能不适合 OP 的情况。
  • 嗯,我认为确实如此。他需要将push 转换为arr 以使其成为一个数组,否则它只是一个对象。
【解决方案2】:

您可以为此使用Map

var myMap = new Map();
var word = "pponoomababaaa";
var chars = word.split("");

chars.forEach(function(char) {
  if (!myMap.get(char)) {
    myMap.set(char, 1);
  } else {
    var count=myMap.get(char);
    count+=1;
    myMap.set(char,count);
  }
});

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
//if to copy to new array
var newarr=Array.from(myMap);
console.log(newarr);

希望对你有帮助

【讨论】:

    【解决方案3】:
    var word = "pponoomababaaa";
    var len = word.length;
    
    function twoLetters (word){
    var arr = []
    word = word.split("")
    for (var i = 0; i < word.length; i++){
        if ((arr[word[i]])) arr[word[i]] += 1
        else arr[word[i]] = 1
      }
    console.log(arr.p)
    return arr  // [ p: 2, o: 3, n: 1, m: 1, a: 5, b: 2 ]
    
    }
    twoLetters(word)
    

    您不是在创建一个数组,而是在创建一个对象。它确实有一个键:值对,正如您将在console.log(arr.p) 中看到的那样,要使其成为一个数组,您需要将push 放入arr。

    【讨论】:

    • 当我创建一个对象或数组时,我得到了同样的结果。如何为每个键设置一个元素:值?如何循环遍历这些键?我知道 arr.a = 5 arr.b = 2;但是我如何比较所有这些并返回最高的 2 个?
    • console.log($.each(arr, function(key, value) { console.log(value); }));
    • 这有帮助吗?我可以看到它在控制台中工作,投票并检查它是否对您有帮助:)
    【解决方案4】:

    这是您更新后的代码,其中 arr 作为对象({})而不是数组([]

    var word = "pponoomababaaa";
    var len = word.length;
    
    function twoLetters (word){
    var arr = {};
    word = word.split("")
    for (var i = 0; i < word.length; i++){
        if ((arr[word[i]])) arr[word[i]] += 1
        else arr[word[i]] = 1
      }
    return arr;  // [ p: 2, o: 3, n: 1, m: 1, a: 5, b: 2 ]
    }
    console.log(twoLetters(word))

    在数组中设置键会将其变成一个对象。您的 arr = [] 在 jsbin 中运行良好(http://jsbin.com/povimehiyu/)(check 控制台)。但这里不在代码 sn-p 中,因此修改了arr = {}

    • 在对象中添加键值不会创建/更新length 属性。
    • 在您上面的代码中,在arr 中添加键将其更改为一个对象,并且每当谁在您的arr 中设置键值时,length 属性都不会更新

    【讨论】:

    • 如果你能解释一下你做了什么就好了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2015-10-13
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多