count重复的字符

时间:2014-06-17 08:32:12

标签: javascript

我想按输入顺序计算重复的字符数。这是我的代码。

<textarea id="field"></textarea>
<input type="submit" name="sub" id="sub" value="GO" />
<div id="charNum"></div>

$("#sub").click(function () {
    var all = "abcdefghijklmnopqrstuvwxyz";
    var str = $("#field").val();
    var text = "";
    for (var i = 0; i < all.length; i++) {
        var char = all.charAt(i);
        if (str.split(char).length > 1) text += str.split(char).length - 1 + "<br>";
    }
    $("#charNum").html(text);
});

如果我输入'mmani',我会得到输出'1121',它会按字母顺序检查。我想要这样的输出:'2111'

6 个答案:

答案 0 :(得分:1)

请查看解释代码中的注释。

var k = "mamma mia miami".split('')

//if you want to exclude spaces
//var k = "mamma mia miami".split(/\s+/).join('').split('')

var p = {};
//count frequency of every character
for(var i=0;i<k.length;i++) {
    var currentChar = k[i];
    if(p[currentChar] == undefined) {
        //initialize counter for new char found
        p[currentChar]=1;
    } else {
        //increment counter for every next match for that char
        p[currentChar]++;
    }
}

var output = '';
//format output according to your need
for(each in p) {
    output += p[each]
}

答案 1 :(得分:1)

听起来你过度复杂,而不是循环整个字母表,为什么不循环遍历值中的字符,并计算出现次数?

var charCount = {};
$.each(this.value.split(''), function(i, v) {
    charCount[v] = charCount[v] + 1 || 1; 
});

Here's a fiddle

答案 2 :(得分:0)

更简洁的方法是将str.charAt(i)str.charAt(i+1)进行比较:

for(var i=1; i<str.length; i++) {
    if(str.charAt(i) === str.charAt(i-1)) {

Demo fiddle

答案 3 :(得分:0)

您可以尝试这个例子:

<强>脚本

var duplicateCount = function(v)
{
    var out = document.getElementById("output");
    console.log("text is: " + v);
    v = v.split('');
    var map = {}, c, t;
    for(var i = 0, l = v.length; i < l; i ++)
    {
        c = v[i];
        t = 0;
        if(map[c])
        {
            t = map[c];
            map[c] = ++ t;
        }
        else
        {
            map[c] = 1;
        }
    }
    console.log(map);
    var arr = [];
    for(var k in map)
    {
        arr.push(map[k]);
    }
    out.value = arr.join('');
};

<强> HTML

<input type="text" onkeyup="duplicateCount(this.value);" placeholder="Text here"/>
<input type="text" readonly="readonly" id="output"/>

答案 4 :(得分:0)

试试这个

$("#sub").click(function () {
        var uniqueOccurence = "";
        var str = $("#field").val();
        for (var i = 0; i < str.length; i++) {
            if(uniqueOccurence.indexOf(str.charAt(i)) < 0)
            uniqueOccurence += str.charAt(i);
        }

        var text = "";
        for (var i = 0; i < uniqueOccurence .length; i++) {
            var char = uniqueOccurence .charAt(i);
            if (str.split(char).length > 1) text += str.split(char).length - 1 + "<br>";
        }
        $("#charNum").html(text);
    });

答案 5 :(得分:0)

这可以通过正则表达式来实现。

<强>解决方案:

$("#sub").click(function () {
    var str = $("#field").val();
    var text = str.match(/([a-z])\1?/g).map(function(a) {return a.length}).join('');

    $("#charNum").html(text); // Will be '2111'
});

它的作用:

正则表达式匹配每个字符([a-z])并且所有字符重复出现(\1引用第一个括号组,其中包含匹配的字符),使用g标志来将它应用于所有字符串。

返回的值将是这样的匹配数组:

[ "mm", "a", "n", "i" ]

映射这些并用它们的长度([ 2, 1, 1, 1 ])替换它们,然后加入返回的字符串将产生预期的结果:"2111"

不确定如何处理相同字符的&gt; = 10的出现。

由于IE8及以下版本不支持Array.prototype.map,因此这是一个避免该功能的解决方案:

$("#sub").click(function () {
    var str = $("#field").val();
    var matches = str.match(/([a-z])\1?/g);
    var text = "";

    for(var i = 0; i < matches.length; i++) {
        text = text + matches[i].length;
    }

    $("#charNum").html(text); // Will be '2111'
});