计算javascript字符串中字符的出现

Ent*_*thu 2 javascript string

我写下了代码来计算字符串中每个字符的计数。对于某些失败的单词,它似乎正常工作。

对于最后一个字符,它失败,因为我看到字符串的长度变得小于迭代计数(但对于某些单词)

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

Jac*_*ord 5

使用对象会更容易。首先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。这些可以被称为什么,我只是用ac一个 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]