我写下了代码来计算字符串中每个字符的计数。对于某些失败的单词,它似乎正常工作。
对于最后一个字符,它失败,因为我看到字符串的长度变得小于迭代计数(但对于某些单词)
var str1 = "america"
function noofchars(str1) {
for (var m = 0; m < str1.length + 1; m++) {
var countno = 1;
if (m != 0) {
str1 = str1.slice(1)
}
str2 = str1.substr(0, 1)
for (var i = 0; i < str1.length; i++) {
if (str2 === str1.charAt(i + 1)) {
countno += 1
str1 = str1.slice(0, i + 1) + str1.slice(i + 2) + " "
}
}
console.log(str1.charAt(0) + "=" + countno)
}
}
var findnoofchar = noofchars(str1)Run Code Online (Sandbox Code Playgroud)
它传递给伦敦,费城,西尔斯,快乐,但失败给美国,芝加哥等伦敦= l = 1,o = 2,n = 2,d = 1
使用对象会更容易。首先reduce进入字符计数,然后遍历键/值对和console.log:
function noofchars(str1) {
let r = [...str1].reduce((a, c) => (a[c] = (a[c] || 0) + 1, a), {});
Object.entries(r).forEach(([k, v]) => console.log(`${k}=${v}`));
}
noofchars("america");Run Code Online (Sandbox Code Playgroud)
ES5语法:
function noofchars(str1) {
var r = str1.split("").reduce(function(a, c) {
a[c] = (a[c] || 0) + 1;
return a;
}, {});
Object.keys(r).forEach(function(k) {
console.log(k + "=" + r[k]);
});
}
noofchars("america");Run Code Online (Sandbox Code Playgroud)
更容易理解reduce上面片段中的操作。
首先,我们采用具有两个参数a和的函数c。这些可以被称为什么,我只是用a和c为一个 ccumulator和Ç urrent项目。
现在,第二行:
a[c] = (a[c] || 0) + 1;
Run Code Online (Sandbox Code Playgroud)
这很难,所以让我们分解一下。首先让我们看一下括号中的内容:
a[c] || 0
Run Code Online (Sandbox Code Playgroud)
此检查是否a有键/值对与键c(如在,该值的c,而不是关键字面上是c)。如果不存在,则返回0。因此,如果a[c]存在,请将其保存为表达式的值,否则使用0。
现在,我们添加1,以增加值。
最后,我们将结果分配给a[c]。因此,如果a包含c,其值a[c]将增加。如果a不包含c,值a[c]会1。
然后,我们返回a以在的下一个迭代中使用reduce。
在下一行:
}, {});
Run Code Online (Sandbox Code Playgroud)
我们为指定一个默认值a。如果我们不这样做,则第一次reduce运行的a将是"a",并且c将是"m"(的的前两个字符america)。这样,a是{}(一个空对象),并且c是"a"。如果没有第二个参数,我们的函数将无法正常工作。
在这一行:
Object.keys(r).forEach(function(k) {...});
Run Code Online (Sandbox Code Playgroud)
我们得到的所有键的数组r,并通过他们与循环forEach,用k是关键。
然后,我们记录k(关键),再加上一个等号=,那么价值的r[k]。