我在线学习课程,其中一个挑战是:
编写一个名为vowelCount的函数,它接受一个字符串并返回一个对象,每个键都是元音,值是字符串中元音出现的次数(对象中键的顺序无关紧要)。
vowelCount('incredible');
// {i:2, e: 2}
vowelCount('awesome');
// {a:1, e:2, o:1}
到目前为止,我已经提出了以下代码,使用Javascript reduce:
function vowelCount(word) {
var vowels = ['a', 'e', 'i', 'o', 'u'];
var final = word.split('').reduce(function(obj, val, index) {
if (vowels.indexOf(val) > -1) {
//obj[val] = 0
obj[val]++;
}
return obj
}, {})
console.log(final)
}
我想我已经接近了,但我无法理解如何在检查元音是否为元音的情况下分配和增加元音键的数值。我尝试将值实例化为0,但只保留值为1。
使用short circuit evaluation检查值是否存在,如果不使用0代替:
console.log(vowelCount('incredible')); // {i:2, e: 2}
console.log(vowelCount('awesome')); // {a:1, e:2, o:1}
function vowelCount(word) {
var vowels = ['a', 'e', 'i', 'o', 'u'];
return word.split('').reduce(function(obj, val, index) {
if (vowels.indexOf(val) > -1) {
obj[val] = (obj[val] || 0) + 1;
}
return obj;
}, {});
}
此外,您可以使用元音初始化结果对象,而不是使用元音数组和Array.indexOf()
检查,并直接递增它们:
console.log(vowelCount('incredible')); // {i:2, e: 2}
console.log(vowelCount('awesome')); // {a:1, e:2, o:1}
function vowelCount(word) {
return word.split('').reduce(function(obj, val) {
if(val in obj) {
obj[val]++;
}
return obj;
}, { a: 0, e: 0, i: 0, o: 0, u: 0 });
}
我认为这实际上是减少的一个坏用例。可能只是使用常规for循环并使用或运算符(||
)用undefined
替换0
:
function vowelCount(word){
const vowels = "aeiou";
const result = {};
for(const char of word)
if(vowels.includes(char))
result[char] = (result[char] || 0) + 1;
return result;
}
如果这太怪异你可以检查结果中是否已存在char并以其他方式设置它:
function vowelCount(word){
const vowels = "aeiou";
const result = {};
for(const char of word){
if(vowels.includes(char)){
if(!result[char]) result[char] = 0;
result[char]++;
}
}
return result;
}
你非常接近!这是因为你试图增加undefined。在增加累加器之前,必须将该值设置为等于累加器上的数字。
function vowelCount(word) {
var vowels = ['a', 'e', 'i', 'o', 'u'];
var final = word.split('').reduce(function(obj, val, index) {
if (vowels.indexOf(val) > -1) {
// if we have seen the vowel, we increment it. Otherwise, it is the first time.
obj[val] ? obj[val]++ : obj[val] = 1;
}
return obj
}, {})
console.log(final)
}