以下函数获取指定字符串中每个字母的出现次数。我理解在第二个for循环之前发生了什么。他为什么要加"var j = i + 1;"
?而不是以"var j=0"
开头?
function okkur(txt) {
var str = txt.toLowerCase().replace(/\s+/g, "").split("");
var okk = "";
var count = 0
for (var i = 0; i < str.length; i++) {
count = 1;
for (var j = i + 1; j <= str.length; j++) {
if (str[i] === str[j]) {
count++;
str.splice(j, 1);
}
}
okk = okk.concat(str[i] + " occurs " + count + " times. \n");
}
return okk;
}
或者是否可以更轻松地完成此功能?
答案 0 :(得分:1)
您可以使用哈希表来计算每个字母的数量。
这种方法使用单个循环访问所有字母,使用另一个循环来生成结果。
function okkur(txt) {
var hash = Object.create(null);
txt .toLowerCase()
.replace(/\s+/g, "")
.split("")
.forEach(function (c) {
hash[c] = (hash[c] || 0) + 1;
});
return Object
.keys(hash)
.map(function (k) {
return k + " occurs " + hash[k] + " times.";
})
.join('\n');
}
console.log(okkur('stackoverflow'));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:0)
通过在j = i + 1而不是j = 0处开始第二个循环,该函数检查索引i之后的所有字母。
答案 2 :(得分:0)
我会选择这样的东西,以便你在一个物体中有一个好的结构。
const charFreq = text => text.split('').reduce((oFrequency, sChar) => {
oFrequency[sChar] ? oFrequency[sChar]++ : oFrequency[sChar] = 1;
return oFrequency
}, {})
根据您的情况,您可以在此结构中显示所需的输出:
Object.keys(charFreq).map(word => `${word} occurs ${charFreq[word]} times`).join('/n')
所以你的最终功能应该是这样的:
function okkur (text) {
const charFreq = text.split('').reduce((oFrequency, sChar) => {
oFrequency[sChar] ? oFrequency[sChar]++ : oFrequency[sChar] = 1
return oFrequency
}, {})
return Object.keys(charFreq).map(word => `${word} occurs ${charFreq[word]} times`).join('\n')
}
console.log(okkur('stackoverflow'))
&#13;
答案 3 :(得分:0)
我决定改进之前给出的答案。它基本上是相同的,除了有另一个函数迭代你要检查的每个数字/字母/符号。它还会检查您正在检查的字符串中出现零次的每个数字/字母/符号。
请记住,我们正在为countTheseCharacters()
函数提供正则表达式。因此,如果有特殊字符,则必须将它们转义(例如点和分隔符)。
这可能不是最高效的解决方案。但我认为这是你可以遵循的东西:)。你也可以用任何东西替换正则表达式,并检查具有相同功能的字符串中存在多少次单词(如披萨)。
function countLetters(string, match){
let regExp = new RegExp(match,"gi");
let result = string.match(regExp);
if(result){
return result.length;
}else{
return 0;
}
}
function countTheseCharacters(string, regularExpressionsToCheck){
let countedNumbers = [];
regularExpressionsToCheck.forEach(function(character){
countedNumbers.push({
'character': character,
'occurances': countLetters(string, character)
});
});
return countedNumbers;
}
let result = countTheseCharacters("Hello. I like Pizza. Do you like pizza too? The pizzaman, said he does as well!", ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "\\bpizza\\b","\\."]);
console.log(result);