Рабочий счетчик слов, но проблема с запятыми и точками - PullRequest
0 голосов
/ 21 октября 2019

У меня есть небольшая программа для отображения, сколько раз слово повторяется в абзаце, но я не могу разделить запятые и точки по какой-то причине. Таким образом, сценарий видит 'Cola', 'Cola,' и 'Cola.' как разные слова.

Как я могу игнорировать знаки препинания?

<script>
    function count() {
        var inputVal = document.getElementById("textInput").value; //get text to count
        var storyWords = inputVal.split(' '); // split words

        var filterWords = storyWords.map(function(x) {
            return x.toLowerCase()
        });
        filterWords.sort();

        var current = null;
        var cnt = 0;

        for (var i = 0; i < filterWords.length; i++) {
            if (filterWords[i] != current) {
                if (cnt > 1) {
                    //    var h = document.getElementById('fillIn');
                    var table = document.getElementById('myTable');
                    var row = table.insertRow(1);
                    var cell1 = row.insertCell(0);
                    var cell2 = row.insertCell(1);
                    cell1.innerHTML = current;
                    cell2.innerHTML = cnt;

                    var h = document.createElement("LI");
                    var t = document.createTextNode(current + ' // --> ' + cnt + ' times');
                    h.appendChild(t);
                    document.body.appendChild(h);

                }
                current = filterWords[i];
                cnt = 1;
            } else {
                cnt++;
            }
        }

        if (cnt > 1) {

            var h = document.createElement("LI");
            //var h = document.getElementById('fillIn');
            var t = document.createTextNode(current + ' // --> ' + cnt + ' times');
            h.appendChild(t);
            document.body.appendChild(h);
        }

        document.getElementById("clickMe").disabled = true;
    }

    // On button click, execute the function
    document.getElementById("clickMe").onclick = function() {
        count();
    }
</script>

enter image description here

Ответы [ 4 ]

3 голосов
/ 21 октября 2019

заменить

var storyWords = inputVal.split(' '); // split words

на

var storyWords = inputVal.split(/[ ,.]/);
0 голосов
/ 21 октября 2019

Функция getWordCnt возвращает массив с вложенными парами ключ / значение, где уникальный ключ представляет слово, а значение определяет количество появлений слова:

function getWordCnt(text) {
  return Object.entries(            // converts an object to an array of [key, value] pairs
    text
      .toLowerCase()
      .split(/\W+/)                 // splits the text where it matches the regexp
      .filter(line => !!line)       // removes elements with empty strings (the last element here)
      .reduce((acc, el) => {        // returns an object which represents word:count pairs
        acc[el] = acc[el] + 1 || 1
        return acc
      }, {})
  )
}

let text = "Hello World, hello Sun!"
const words=getWordCnt(text) // [ [ "hello", 2 ], [ "world", 1 ], [ "sun", 1 ] ]

Вы можете манипулировать им дальше через деструктурирование , например:

const strings = words.map(
  ([key, value]) => `The word '${key}' appears ${value} time(s)`
)
console.log(strings)  // [ "The word 'hello' appears 2 time(s)", "The word 'world' appears 1 time(s)", "The word 'sun' appears 1 time(s)" ]
0 голосов
/ 21 октября 2019

Вы можете изменить это:

var storyWords = inputVal.split(' '); // split words

По:

var storyWords = inputVal.toLowerCase().match(/\w+/g); // split words

Обратите внимание, что мы преобразуем всю строку в нижний регистр, поэтому вы можете избавиться:

var filterWords = storyWords.map(function(x) {
     return x.toLowerCase()
});

и непосредственно выполните сортировку:

storyWords.sort();

Примечание:

\ w + Соответствует любому буквенно-цифровому символу, включая подчеркивание. Эквивалентно [A-Za-z0-9 _].

0 голосов
/ 21 октября 2019

Немного измените свою функцию, и все готово. Прежде чем вместо прямой проверки для filterWords [i], удалите из него все знаки пунктуации, используя replace ()

var word = filterWords [i] .replace (".", "")) .Replace(",", "") .replace ("!", "");

Новая функция будет выглядеть так: -

<script>
    function count() {
        var inputVal = document.getElementById("textInput").value; //get text to count
        var storyWords = inputVal.split(' '); // split words

        var filterWords = storyWords.map(function(x) {
            return x.toLowerCase()
        });
        filterWords.sort();

        var current = null;
        var cnt = 0;

        for (var i = 0; i < filterWords.length; i++) {
        var word = filterWords[i].replace(".", "").replace(",", "").replace("!", "");
        if (word != current) {
                if (cnt > 1) {
                    //    var h = document.getElementById('fillIn');
                    var table = document.getElementById('myTable');
                    var row = table.insertRow(1);
                    var cell1 = row.insertCell(0);
                    var cell2 = row.insertCell(1);
                    cell1.innerHTML = current;
                    cell2.innerHTML = cnt;

                    var h = document.createElement("LI");
                    var t = document.createTextNode(current + ' // --> ' + cnt + ' times');
                    h.appendChild(t);
                    document.body.appendChild(h);

                }
                current = filterWords[i];
                cnt = 1;
            } else {
                cnt++;
            }
        }

        if (cnt > 1) {

            var h = document.createElement("LI");
            //var h = document.getElementById('fillIn');
            var t = document.createTextNode(current + ' // --> ' + cnt + ' times');
            h.appendChild(t);
            document.body.appendChild(h);
        }

        document.getElementById("clickMe").disabled = true;
    }

    // On button click, execute the function
    document.getElementById("clickMe").onclick = function() {
        count();
    }
</script>
...