在数组中查找重复的字母(javascript)

时间:2018-04-21 23:06:08

标签: javascript arrays string

我对此和javascript有了新的认识。我试图解决一个练习,即在数组中找到重复的字母a。要做的是使用基本结构(没有正则表达式既不是javascript的新方法(只有ES5))。我需要这样做才能理解语言的基础。

输出必须是:


//美国队长,这封信' C' => 2次。
//美国队长,这封信' A' => 4次。
//美国队长,这封信'我' => 2次。

我不是在寻找解决方案,只是寻找解决方案的方法和逻辑结构。欢迎任何建议。

我的方式,但它不起作用:

function duplicateLetter(name) {
  var newArray = [];

  for (var i=0; i<name.length; i++) {
    console.log(name[i].indexOf(newArray));

    if (name[i].indexOf(newArray) === 0) {
        newArray.push(name[i]);
    }
  }

   console.log(newArray);   

  //console.log(name + ", the letter '" + (newArray[0]).toUpperCase() + "' => " + newArray.length + " times");
}

duplicateLetter("Captain America");

2 个答案:

答案 0 :(得分:2)

function duplicateLetter(o) {
    var arr = o.toUpperCase().split('');
    var obj = {};

    for(var v in arr) {
        obj[arr[v]] = obj[arr[v]] || 0;
        obj[arr[v]]++;
    }

    for(var v in obj) {
        console.log(o + ", the letter '" + v + "' => " + obj[v] + ' times.');
    }
}

duplicateLetter("Captain America");

解释:

  • 我们将字符串大写,然后将其转换为字母数组。
  • 我们循环遍历数组,此处arr[v]成为我们的信件,并且:
    • 如果我们的对象中不存在键arr[v],我们会将其设置为0
    • 我们在对象中递增键arr[v]的值(这会导致obj ['c']在每次字母为c时递增。您可以注意到这会跟踪我们的字母数量字符串。
  • 我们遍历对象v,将每个字母的出现次数打印到控制台。

请注意,这会将空格字符视为字母。如果您想要一个没有的答案,请注明。

这是一个不同的答案,它不使用对象,只计算字母(而不是空格或标点符号)来证明一切都可能以多种方式实现。

// Not using objects and not counting anything but letters.
function duplicateLetter(o) {
    var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var arr = o.toUpperCase().split('');
    var count = [];

    for(var v in arr) {
        pos = letters.indexOf(arr[v]);
        if(pos < 0) continue; // It wasn't a letter.
        count[pos] = count[pos] || 0;
        count[pos]++;
    }

    for(var v in count) {
        if(!(count[v] > 0)) continue; // The letter never appeared.
        console.log(o + ", the letter '" + letters[v] + "' => " + count[v] + ' times.');
    }
}

duplicateLetter("Captain America");

我可能也会尝试一个完全不使用数组的答案!

修改 您可以使用(a in b)循环来迭代数组和对象。这是因为数组实际上只是一个对象,其中所有可枚举属性都有整数索引:

arr = [10,15,"hi"] 几乎与Javascript内部工作方式的arr = {'0' : 10, '1' : 15, '2' : "hi"}相同。因此,for(v in arr)将正常迭代数组。

根据要求,与正常的循环相同的答案:

// Not using objects and not counting anything but letters.
function duplicateLetter(o) {
    var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var arr = o.toUpperCase().split('');
    var count = [];

    for(var v = 0; v < arr.length; v++) {
        pos = letters.indexOf(arr[v]);
        if(pos < 0) continue; // It wasn't a letter.
        count[pos] = count[pos] || 0;
        count[pos]++;
    }

    for(var v = 0; v < count.length; v++) {
        if(!(count[v] > 0)) continue; // The letter never appeared.
        console.log(o + ", the letter '" + letters[v] + "' => " + count[v] + ' times.');
    }
}

duplicateLetter("Captain America");

请注意,for strong中的没有任何改变。在我看来,for-in表示法让人脑更容易理解,这也是我使用它的原因。

至于count[pos] = count[pos] || 0;,解释它为什么会这样做是非常繁琐的,因为它要求你准确地知道||运算符的作用。所以我只是说明它的作用,而不解释它。

基本上,count[pos] = count[pos] || 0;与:

相同
if(count[pos]) { // If count[pos] evaluates to true.
    count[pos] = count[pos]
} else { // count[pos] is false, '', null, undefined, 0, or any other value that evaluates to false.
    count[pos] = 0;
}

请注意,这是有效的,因为在开始时,count[pos]undefinedcount是一个空数组),因此它会在其中放置0。如果我们再次找到该字母,count[pos]已定义,并且是正值,因此评估为true,因此我们不会更改它。

只需将a = a || b视为等于:

  

如果ba(或通过任何其他方式评估为a),请将undefined的默认值设为false。“

答案 1 :(得分:0)

创建一个对象,其键是字母,值是该字母重复的次数。例如, &#39; ABBC&#39; =&GT; {&#39; a&#39;:1,&#39; b&#39;:2,&#39; c&#39;:1}