我在网上学习了一门课程,其中一个挑战是:
编写一个名为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。
答案 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 });
}
答案 1 :(得分:0)
我认为这对于reduce来说实际上是一个糟糕的用例。可能只是使用常规for循环并使用or运算符(||
)将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;
}
答案 2 :(得分:0)
你非常接近!这是因为你试图增加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)
}