我写下了代码来计算字符串中每个字符的计数。 对于某些单词来说,似乎失败了。
最后一个字符失败,因为我看到字符串的长度变得小于迭代计数(但是对于某些单词)
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
答案 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
在做什么。
首先,我们采用具有两个参数a
和c
的函数。这些都可以称为任何东西,我只使用a
和c
作为 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');
}
}