Javascript分配和增加Obj的键值(使用Reduce)

时间:2018-03-03 22:05:35

标签: javascript arrays object

我在网上学习了一门课程,其中一个挑战是:

编写一个名为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。

3 个答案:

答案 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)
}