计算Javascript中字符串中每个字母表的出现次数



我以前见过类似的问题,比如计算给定字符串中的字符数。然而,当涉及到将给定字符串与字母表中的字母进行比较,并返回一个出现如下情况的对象时:

const letters = ["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"]
const sampleString = "a bee";
const results = {
a: 1,
b: 1,
c: 0,
d: 0,
e: 2,
f: 0,
...
}

我们可以使用Array.reduce((,以计数sampleString中的字母。

我们首先创建一个letterMap来指定要计数的所有有效字母。

在reduce循环中,我们使用(acc中的c(表达式,仅递增letterMap中存在的字母。

const letters = ["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"]
const sampleString = "a bee";
const letterMap = letters.reduce((acc, c) => { 
acc[c] = 0; 
return acc; 
}, {});
const result = [...sampleString].reduce((acc, c) => {
if (c in acc) acc[c]++;
return acc;
}, letterMap);
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

这里有另一种方法,只使用一个循环,再次使用Array.reduce(),这假设我们不希望计算空白:

const letters = ["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"]
const sampleString = "a bee";
const result = [...letters, ...sampleString].reduce((acc, c) => {
if (c in acc) { 
acc[c]++;
} else if (c.trim()) {
acc[c] = 0;
}
return acc;
}, {});
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

我喜欢使用Object.fromEntries

const sampleString = "a bee";
const result = Object.fromEntries(Array.from("abcdefghijklmnopqrstuvwxyz", ch => [ch, 0]));
for (let ch of sampleString) 
if (ch in result) result[ch]++;
console.log(result);

使用Array.reduceString.match可能是一个想法。因此,对于letters的每个字母,使用match(长度(来确定给定样本中字母的频率。

const letters = `abcdefghijklmnopqrstuvwxyz`.split(``);
const freq = (chr, sample) => (sample.match(RegExp(chr, `g`)) || []).length;
const result = letters.reduce( (acc, chr) => 
({...acc, [chr]: freq(chr, acc.sample)}), {sample: "a bee"});
console.log(result);

或者更不可取的方式

const letters = ["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"]
const sampleString = "a bee";
results = {};
sampleString.forEach(letter=>{
if(letters.includes(letter)) {
if(results[letter] === undefined) results[letter]=0;
results[letter]++;
}
});

将值作为键是一种糟糕的做法,因为它很难阅读,我建议称之为

const letters = ["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"]
const tempString = "This is a string.";
let results = []
letters.forEach( char =>{
const count = countCharacterOccurences(tempString, char)
results.push({ alphabet: char, count })
})
function countCharacterOccurences(string, char) {
return string.split(char).length - 1;
}
console.log(results)
//filter alphabet with value
const alphabetWithCount = results.filter( result => {
return result.count > 0
})
console.log(alphabetWithCount)
//log alphabet only with counts
const alphabetOnlyWithCounts = alphabetWithCounts.map( alphabetWithCount => {
return alphabetWithCount.alphabet
})
console.log(alphabetOnlyWithCounts)
//

您可以直接在字母上应用.reduce(),在每次迭代中使用RegExp()替换所有与当前letter不匹配的字母,并用.length:计算字符串中的剩余字母(如果有的话(

const letters = ["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"];
const sampleString = "a bee";
const results = letters.reduce((result,letter) => ({
...result, 
[letter]: sampleString.replace(new RegExp(`[^${letter}]`,'g'), "").length
}), {});
console.log( results );

注意

请注意:

sr.replace(new RegExp('[^a]','g'), "").length

例如,相当于:

sr.replace(/[^a]/g,"").length

请参阅:JavaScript:一个字符在一个字符串中出现多少次?

最新更新