我想按输入顺序计算重复的字符数。这是我的代码。
<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'
。
答案 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;
});
答案 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)) {
答案 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'
});