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

时间:2019-06-30 23:32:33

标签: 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)

它传递给伦敦,费城,西尔斯,快乐 但对美国,芝加哥等却失败 伦敦= l = 1,o = 2,n = 2,d = 1

3 个答案:

答案 0 :(得分: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");

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");

更容易理解以上摘录中的reduce在做什么。

首先,我们采用具有两个参数ac的函数。这些都可以称为任何东西,我只使用ac作为 a 累积器和 c 当前项目。

现在,第二行:

a[c] = (a[c] || 0) + 1;

这很难,所以让我们分解一下。首先,让我们看看括号中的内容:

a[c] || 0

这将检查a是否具有键c的键/值对(例如c value 而不是实际上是c)。如果不存在,则返回0。因此,如果存在a[c],请将其保存为表达式的值,否则使用0

现在,我们添加1,以增加值。

最后,我们将结果分配给a[c]。因此,如果a包含c,则a[c]的值将增加。如果a不包含c,则a[c]的值为1

然后,我们返回a,将在reduce的下一次迭代中使用。

在下一行:

}, {});

我们为a指定了默认值。如果我们不这样做,则第一次运行reduce时,a将是"a",而c将是"m"america)。这样,a{}(空对象),而c"a"。如果没有第二个参数,我们的函数将无法正常工作。

在这一行:

Object.keys(r).forEach(function(k) {...});

我们得到r中所有键的数组,并以forEach为键,以k遍历它们。

然后,我们记录k(键),然后是等号=,然后是r[k] value

答案 1 :(得分:0)

您可以按每个字符分割字符串,然后通过如下的reduce函数计算每个字符的出现次数

function noofchars(str1) {
  const chArray = str1.split('');
  return chArray.reduce(function(acc, ch) {
    if (acc[ch]) {
      acc[ch]++;
    } else {
      acc[ch] = 1;
    }
    return acc;
  }, {});
 }

 var str1 = "america";
 var findnoofchar = noofchars(str1);
 console.log(findnoofchar);

在您的解决方案中,您正在此行中对str1进行突变

str1 = str1.slice(0, i + 1) + str1.slice(i + 2) + " "

实际更改字符串的长度,并在第一个循环中检查str1.length。在这种情况下,您可以将长度放在首位。您的代码段的工作版本在这里

var str1 = "america"

function noofchars(str1) {
  const len = str1.length;
  for (var m = 0; m < len; m++) {
    var countno = 1;
    if (m !== 0) {
      str1 = str1.slice(1)
    }
    if (str1.charAt(0) === ' ') {
      break;
    }
    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)

答案 2 :(得分:0)

不真正知道您要用代码完成什么,一种解决方案是利用charAt和Set函数。 CharAt是一种遍历字符串的更直接的方法,而Set函数可以自动消除字符集中的重复字符。

ConsecutiveNomina = 2
class Employee extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'fldTimeStamp'
    ];

    protected $connection = 'sqlsrv';

    protected $table      = 'IGNom_Trabajador';

    protected $primaryKey = 'Consecutivo_Trabajador';

    public function client(){

        return $this->belongsTo('App\Client', 'ConsecutivoDpto');

    }

    public function position(){

        return $this->belongsTo('App\Position', 'ConsecutivoTrabajador');

    }

}