Javascript объект - PullRequest
       0

Javascript объект

0 голосов
/ 09 мая 2020

Я столкнулся с проблемой в онлайн-курсе:

Напишите функцию с именем vowelCount, которая принимает строку и возвращает объект с ключами в качестве гласной и значениями в виде количества раз, когда гласная появляется в строка. Эта функция должна быть нечувствительной к регистру, поэтому должны учитываться строчные и прописные буквы

Примеры: vowelCount ('El ie') // {e: 2, i: 1};

решение от инструктора было таким:

function vowelCount(str){
    var splitArr = str.toLowerCase().split("");
    var obj = {};
    var vowels = "aeiou";

    splitArr.forEach(function(letter){
        if(vowels.indexOf(letter) !== -1){
            if(obj[letter]){
                obj[letter]++;
            } else{
                obj[letter] = 1;
            }
        }
    });
    return obj;
}

Я понимаю решение до второго оператора «if». Я знаю, что первая инструкция «if» проверяет, принадлежат ли «буквы» во входной строке «гласным». Затем во втором «if» он проверяет, находится ли «буква» в пустом объекте «obj», созданном выше, но в этой строке «obj» пуст, пока к нему не добавляется «буква», так что точка для этого «если». Кроме того, почему для добавления этой новой «буквы» к объекту требуется приращение. Я попробовал код без приращения, но объект все еще пуст.

Ответы [ 2 ]

0 голосов
/ 13 мая 2020

Мы можем использовать регулярное выражение для сопоставления гласных в предложении.

Регулярное выражение для соответствия всем появлению гласных в строке: / [aeiouAEIOU] +? / G

Ниже фрагмент рабочего кода:

    //function that takes string as input
    //function returns an object containing vowel count without case in account.
    function vowelCount(input) {
        //to get vowel count using string.match
        var arrVowels =input.match(/[aeiouAEIOU]+?/g);

        //acc=accumulator, curr=current value
        return arrVowels.reduce(function (acc, curr) {

           if (typeof acc[curr.toLowerCase()] == 'undefined') {
               acc[curr.toLowerCase()] = 1;
           } 
           else {
               acc[curr.toLowerCase()] += 1;
           }
           return acc;

           // the blank object below is default value of the acc (accumulator)
           }, {});           
      }
0 голосов
/ 09 мая 2020

Это проверка, видели ли вы когда-нибудь письмо в l oop. Если вы никогда не писали в obj[letter], тогда, когда вы выполняете obj[letter], вы получаете обратно значение undefined, которое является ложным (обрабатывается как false такими вещами, как if). if(obj[letter]) проверяет истинное значение (значение, которое не является ложным), чтобы оно добавлялось к числу, уже сохраненному в obj[letter], если оно есть (obj[letter]++). Но когда он видит ложное значение, например undefined, он берет ветвь else и устанавливает obj[letter] в 1, потому что код знает, что letter раньше не видел.


Просто FWIW, хотя и полностью действующий, это довольно старый код JavaScript (примерно по стандарту ES5, 2009 г.). ES2015 добавил несколько функций, которые вы бы использовали для решения этой проблемы сегодня:

function vowelCount(str){
    // Use a Map to remember how many of each ltter you've
    // seen. You could use an object as well, but ideally you'd
    // create the object with out a prototype to avoid having
    // any conflict with inherited properties from `Object.prototype`.
    const counts = new Map(); // const counts = Object.create(null);

    // The set of vowels
    const vowels = new Set("aeiou");

    // Loop through the letters
    for (const letter of str) {
        // If it's not a vowel...
        if (!vowels.has(letter)){
            // Count it
            const currentCount = counts.get(letter) || 0;
            counts.set(letter, currentCount + 1);
            // Or using an object:
            // const currentCount = counts[letter] || 0;
            // counts[letter] = currentCount + 1;
        }
    });
    return counts;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...