Contando palavras em string

90

Eu estava tentando contar palavras em um texto desta forma:

function WordCount(str) {
  var totalSoFar = 0;
  for (var i = 0; i < WordCount.length; i++)
    if (str(i) === " ") { // if a space is found in str
      totalSoFar = +1; // add 1 to total so far
  }
  totalsoFar += 1; // add 1 to totalsoFar to account for extra space since 1 space = 2 words
}

console.log(WordCount("Random String"));

Acho que entendi muito bem, exceto que a ifafirmação está errada. A parte que verifica se str(i)contém um espaço e adiciona 1.

Editar:

Eu descobri (graças ao Blender) que posso fazer isso com muito menos código:

function WordCount(str) { 
  return str.split(" ").length;
}

console.log(WordCount("hello world"));
Valerio Bozz
fonte
Não str.split(' ').lengthseria um método mais fácil? jsfiddle.net/j08691/zUuzd
j08691
Ou str.split(' ')então conte aqueles que não são strings de comprimento zero?
Katie Kilian,
7
string.split ('') .length não funciona. Os espaços nem sempre são fronteiras de palavras! E se houver mais de um espaço entre duas palavras? A respeito ". . ." ?
Aloso
Como disse Aloso, esse método não funciona.
Reality-Torrent
1
@ Reality-Torrent Este é um post antigo.
cst1992

Respostas:

105

Use colchetes, não parênteses:

str[i] === " "

Ou charAt:

str.charAt(i) === " "

Você também pode fazer isso com .split():

return str.split(' ').length;
Liquidificador
fonte
Acho que entendi o que você está dizendo: meu código acima na pergunta original editada parece bom?
sua solução funcionaria onde as palavras são delimitadas por qualquer coisa diferente do caractere de espaço? Diga por novas linhas ou guias?
nemesisfixx
7
@Blender boa solução, mas isso pode dar o resultado errado para espaços duplos omitidos em uma string ..
ipalibowhyte
91

Experimente antes de reinventar as rodas

de Contar o número de palavras na string usando JavaScript

function countWords(str) {
  return str.trim().split(/\s+/).length;
}

de http://www.mediacollege.com/internet/javascript/text/count-words.html

function countWords(s){
    s = s.replace(/(^\s*)|(\s*$)/gi,"");//exclude  start and end white-space
    s = s.replace(/[ ]{2,}/gi," ");//2 or more space to 1
    s = s.replace(/\n /,"\n"); // exclude newline with a start spacing
    return s.split(' ').filter(function(str){return str!="";}).length;
    //return s.split(' ').filter(String).length; - this can also be used
}

de Use JavaScript para contar palavras em uma string, SEM usar um regex - esta será a melhor abordagem

function WordCount(str) {
     return str.split(' ')
            .filter(function(n) { return n != '' })
            .length;
}

Notas do autor:

Você pode adaptar este script para contar palavras da maneira que quiser. A parte importante é s.split(' ').length- isso conta os espaços. O script tenta remover todos os espaços extras (espaços duplos, etc.) antes de contar. Se o texto contiver duas palavras sem espaço entre elas, ele as contará como uma palavra, por exemplo, "Primeira frase. Início da próxima frase".

internals-in
fonte
Só nunca vi essa sintaxe: s = s.replace (/ (^ \ s *) | (\ s * $) / gi, ""); s = s.replace (/ [] {2,} / gi, ""); s = s.replace (/ \ n /, "\ n"); o que cada linha significa? desculpe por ser tão carente
qualquer coisa? este código é muito confuso e aquele site que você literalmente copiou e colou dele não ajuda em nada. Estou confuso, mais do que qualquer coisa, acho que é suposto verificar se há palavras sem espaços ou espaços duplos, mas como? apenas um milhão de caracteres colocados aleatoriamente realmente não ajuda ...
Isso é bom, tudo que eu estava pedindo é que você explicasse o código que você escreveu. Nunca vi a sintaxe antes e queria saber o que significava. Tudo bem. Fiz uma pergunta separada e alguém respondeu a minha pergunta em profundidade. Desculpe por pedir tanto.
1
str.split (/ \ s + /). length não funciona realmente como está: o espaço em branco à direita é tratado como outra palavra.
Ian
2
Observe que ele retorna 1 para entrada vazia.
pie6k 01 de
21

Mais uma maneira de contar palavras em uma string. Este código conta palavras que contêm apenas caracteres alfanuméricos e caracteres "_", "'", "-", "'".

function countWords(str) {
  var matches = str.match(/[\w\d\’\'-]+/gi);
  return matches ? matches.length : 0;
}
Alex
fonte
2
Você também pode adicionar ’'-para que "Miau de gato" não conte como 3 palavras. E "entre"
mpen
@mpen obrigado pela sugestão. Eu atualizei minha resposta de acordo com isso.
Alex
O primeiro caractere na minha string é uma
apuração à
1
Você não precisa escapar ’'em um regex. Use /[\w\d’'-]+/gipara evitar avisos ESLint no-useless-escape
Stefan Blamberg
18

Depois de limpar a string, você pode combinar caracteres sem espaço em branco ou limites de palavras.

Aqui estão duas expressões regulares simples para capturar palavras em uma string:

  • Sequência de caracteres sem espaço em branco: /\S+/g
  • Caracteres válidos entre os limites das palavras: /\b[a-z\d]+\b/g

O exemplo abaixo mostra como recuperar a contagem de palavras de uma string, usando esses padrões de captura.

/*Redirect console output to HTML.*/document.body.innerHTML='';console.log=function(s){document.body.innerHTML+=s+'\n';};
/*String format.*/String.format||(String.format=function(f){return function(a){return f.replace(/{(\d+)}/g,function(m,n){return"undefined"!=typeof a[n]?a[n]:m})}([].slice.call(arguments,1))});

// ^ IGNORE CODE ABOVE ^
//   =================

// Clean and match sub-strings in a string.
function extractSubstr(str, regexp) {
    return str.replace(/[^\w\s]|_/g, '')
        .replace(/\s+/g, ' ')
        .toLowerCase().match(regexp) || [];
}

// Find words by searching for sequences of non-whitespace characters.
function getWordsByNonWhiteSpace(str) {
    return extractSubstr(str, /\S+/g);
}

// Find words by searching for valid characters between word-boundaries.
function getWordsByWordBoundaries(str) {
    return extractSubstr(str, /\b[a-z\d]+\b/g);
}

// Example of usage.
var edisonQuote = "I have not failed. I've just found 10,000 ways that won't work.";
var words1 = getWordsByNonWhiteSpace(edisonQuote);
var words2 = getWordsByWordBoundaries(edisonQuote);

console.log(String.format('"{0}" - Thomas Edison\n\nWord count via:\n', edisonQuote));
console.log(String.format(' - non-white-space: ({0}) [{1}]', words1.length, words1.join(', ')));
console.log(String.format(' - word-boundaries: ({0}) [{1}]', words2.length, words2.join(', ')));
body { font-family: monospace; white-space: pre; font-size: 11px; }


Encontrando Palavras Únicas

Você também pode criar um mapeamento de palavras para obter contagens exclusivas.

function cleanString(str) {
    return str.replace(/[^\w\s]|_/g, '')
        .replace(/\s+/g, ' ')
        .toLowerCase();
}

function extractSubstr(str, regexp) {
    return cleanString(str).match(regexp) || [];
}

function getWordsByNonWhiteSpace(str) {
    return extractSubstr(str, /\S+/g);
}

function getWordsByWordBoundaries(str) {
    return extractSubstr(str, /\b[a-z\d]+\b/g);
}

function wordMap(str) {
    return getWordsByWordBoundaries(str).reduce(function(map, word) {
        map[word] = (map[word] || 0) + 1;
        return map;
    }, {});
}

function mapToTuples(map) {
    return Object.keys(map).map(function(key) {
        return [ key, map[key] ];
    });
}

function mapToSortedTuples(map, sortFn, sortOrder) {
    return mapToTuples(map).sort(function(a, b) {
        return sortFn.call(undefined, a, b, sortOrder);
    });
}

function countWords(str) {
    return getWordsByWordBoundaries(str).length;
}

function wordFrequency(str) {
    return mapToSortedTuples(wordMap(str), function(a, b, order) {
        if (b[1] > a[1]) {
            return order[1] * -1;
        } else if (a[1] > b[1]) {
            return order[1] * 1;
        } else {
            return order[0] * (a[0] < b[0] ? -1 : (a[0] > b[0] ? 1 : 0));
        }
    }, [1, -1]);
}

function printTuples(tuples) {
    return tuples.map(function(tuple) {
        return padStr(tuple[0], ' ', 12, 1) + ' -> ' + tuple[1];
    }).join('\n');
}

function padStr(str, ch, width, dir) { 
    return (width <= str.length ? str : padStr(dir < 0 ? ch + str : str + ch, ch, width, dir)).substr(0, width);
}

function toTable(data, headers) {
    return $('<table>').append($('<thead>').append($('<tr>').append(headers.map(function(header) {
        return $('<th>').html(header);
    })))).append($('<tbody>').append(data.map(function(row) {
        return $('<tr>').append(row.map(function(cell) {
            return $('<td>').html(cell);
        }));
    })));
}

function addRowsBefore(table, data) {
    table.find('tbody').prepend(data.map(function(row) {
        return $('<tr>').append(row.map(function(cell) {
            return $('<td>').html(cell);
        }));
    }));
    return table;
}

$(function() {
    $('#countWordsBtn').on('click', function(e) {
        var str = $('#wordsTxtAra').val();
        var wordFreq = wordFrequency(str);
        var wordCount = countWords(str);
        var uniqueWords = wordFreq.length;
        var summaryData = [
            [ 'TOTAL', wordCount ],
            [ 'UNIQUE', uniqueWords ]
        ];
        var table = toTable(wordFreq, ['Word', 'Frequency']);
        addRowsBefore(table, summaryData);
        $('#wordFreq').html(table);
    });
});
table {
    border-collapse: collapse;
    table-layout: fixed;
    width: 200px;
    font-family: monospace;
}
thead {
    border-bottom: #000 3px double;;
}
table, td, th {
    border: #000 1px solid;
}
td, th {
    padding: 2px;
    width: 100px;
    overflow: hidden;
}

textarea, input[type="button"], table {
    margin: 4px;
    padding: 2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<h1>Word Frequency</h1>
<textarea id="wordsTxtAra" cols="60" rows="8">Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.

Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this.

But, in a larger sense, we can not dedicate -- we can not consecrate -- we can not hallow -- this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us -- that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion -- that we here highly resolve that these dead shall not have died in vain -- that this nation, under God, shall have a new birth of freedom -- and that government of the people, by the people, for the people, shall not perish from the earth.</textarea><br />
<input type="button" id="countWordsBtn" value="Count Words" />
<div id="wordFreq"></div>

Sr. Polywhirl
fonte
1
Esta é uma resposta incrível e abrangente. Obrigado por todos os exemplos, eles são realmente úteis!
Connor
14

Eu acho que esse método é mais do que você quer

var getWordCount = function(v){
    var matches = v.match(/\S+/g) ;
    return matches?matches.length:0;
}
Sean
fonte
7

String.prototype.match retorna uma matriz, podemos então verificar o comprimento,

Acho que este método é mais descritivo

var str = 'one two three four five';

str.match(/\w+/g).length;
iamwhitebox
fonte
1
local potencial para ocorrer um erro se a string estiver vazia
Purkhalo Alex
5

A maneira mais fácil que encontrei até agora é usar uma regex com divisão.

var calculate = function() {
  var string = document.getElementById('input').value;
  var length = string.split(/[^\s]+/).length - 1;
  document.getElementById('count').innerHTML = length;
};
<textarea id="input">My super text that does 7 words.</textarea>
<button onclick="calculate()">Calculate</button>
<span id="count">7</span> words

Tim
fonte
3

A resposta dada por @ 7-isnotbad é extremamente próxima, mas não conta linhas de uma única palavra. Aqui está a correção, que parece ser responsável por todas as combinações possíveis de palavras, espaços e novas linhas.

function countWords(s){
    s = s.replace(/\n/g,' '); // newlines to space
    s = s.replace(/(^\s*)|(\s*$)/gi,''); // remove spaces from start + end
    s = s.replace(/[ ]{2,}/gi,' '); // 2 or more spaces to 1
    return s.split(' ').length; 
}
Neokio
fonte
3

Aqui está minha abordagem, que simplesmente divide uma string por espaços, então, faz um loop no array e aumenta a contagem se o array [i] corresponder a um determinado padrão regex.

    function wordCount(str) {
        var stringArray = str.split(' ');
        var count = 0;
        for (var i = 0; i < stringArray.length; i++) {
            var word = stringArray[i];
            if (/[A-Za-z]/.test(word)) {
                count++
            }
        }
        return count
    }

Chamado assim:

var str = "testing strings here's a string --..  ? // ... random characters ,,, end of string";
wordCount(str)

(adicionados caracteres e espaços extras para mostrar a precisão da função)

O str acima retorna 10, o que é correto!

user3743140
fonte
Alguns idiomas não usam [A-Za-z]nada
David
2

Pode haver uma maneira mais eficiente de fazer isso, mas é o que funcionou para mim.

function countWords(passedString){
  passedString = passedString.replace(/(^\s*)|(\s*$)/gi, '');
  passedString = passedString.replace(/\s\s+/g, ' '); 
  passedString = passedString.replace(/,/g, ' ');  
  passedString = passedString.replace(/;/g, ' ');
  passedString = passedString.replace(/\//g, ' ');  
  passedString = passedString.replace(/\\/g, ' ');  
  passedString = passedString.replace(/{/g, ' ');
  passedString = passedString.replace(/}/g, ' ');
  passedString = passedString.replace(/\n/g, ' ');  
  passedString = passedString.replace(/\./g, ' '); 
  passedString = passedString.replace(/[\{\}]/g, ' ');
  passedString = passedString.replace(/[\(\)]/g, ' ');
  passedString = passedString.replace(/[[\]]/g, ' ');
  passedString = passedString.replace(/[ ]{2,}/gi, ' ');
  var countWordsBySpaces = passedString.split(' ').length; 
  return countWordsBySpaces;

}

é capaz de reconhecer todos os seguintes como palavras separadas:

abc,abc= 2 palavras,
abc/abc/abc= 3 palavras (funciona com barras para frente e para trás),
abc.abc= 2 palavras,
abc[abc]abc= 3 palavras,
abc;abc= 2 palavras,

(algumas outras sugestões que tentei contar cada exemplo acima como apenas 1 x palavra) também:

  • ignora todos os espaços em branco à esquerda e à direita

  • conta uma única letra seguida por uma nova linha, como uma palavra - o que eu descobri que algumas das sugestões dadas nesta página não contam, por exemplo:
    a
    a
    a
    a
    a
    às vezes é contado como 0 x palavras, e outras funções contam apenas como 1 x palavra, em vez de 5 x palavras)

se alguém tiver alguma ideia sobre como melhorá-lo, ou mais limpo / mais eficiente - adicione 2 centavos! Espero que isso ajude alguém.

torneiro
fonte
2
function countWords(str) {
    var regEx = /([^\u0000-\u007F]|\w)+/g;  
    return str.match(regEx).length;
}

Explicação:

/([^\u0000-\u007F]|\w)corresponde a caracteres de palavras - o que é ótimo -> regex faz o trabalho pesado para nós. (Este padrão é baseado na seguinte resposta do SO: https://stackoverflow.com/a/35743562/1806956 por @Landeeyo)

+ corresponde a toda a sequência de caracteres de palavras especificados anteriormente - portanto, basicamente agrupamos os caracteres de palavras.

/g significa que continua procurando até o fim.

str.match(regEx) retorna uma matriz das palavras encontradas - então contamos seu comprimento.

Ronen Rabinovici
fonte
1
O regex complicado é a arte da bruxaria. Um feitiço que aprendemos a pronunciar, mas nunca temos coragem de perguntar o porquê. Obrigado por compartilhar.
Blaise
^ essa é uma frase incrível
r3wt
Estou recebendo este erro: erro Caractere (s) de controle inesperado (s) na expressão regular: \ x00 no-control-regex
Aliton Oliveira
Este regex apresentará erro se a string começar com / ou (
Walter Monecke
@WalterMonecke acabou de testá-lo no Chrome - não obteve o erro. Onde você conseguiu um erro com isso? Obrigado
Ronen Rabinovici
2

Para quem deseja utilizar o Lodash pode utilizar a _.wordsfunção:

var str = "Random String";
var wordCount = _.size(_.words(str));
console.log(wordCount);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Penny Liu
fonte
2

Isso tratará de todos os casos e é o mais eficiente possível. (Você não quer dividir ('') a menos que saiba de antemão que não há espaços maiores que um.):

var quote = `Of all the talents bestowed upon men, 
              none is so precious as the gift of oratory. 
              He who enjoys it wields a power more durable than that of a great king. 
              He is an independent force in the world. 
              Abandoned by his party, betrayed by his friends, stripped of his offices, 
              whoever can command this power is still formidable.`;

function WordCount(text) {
    text = text.trim();
    return text.length > 0 ? text.split(/\s+/).length : 0;
}
console.log(WordCount(quote));//59
console.log(WordCount('f'));//1
console.log(WordCount('  f '));//1
console.log(WordCount('   '));//0
WesleyAC
fonte
1

Esta é uma função que conta o número de palavras em um código HTML:

$(this).val()
    .replace(/((&nbsp;)|(<[^>]*>))+/g, '') // remove html spaces and tags
    .replace(/\s+/g, ' ') // merge multiple spaces into one
    .trim() // trim ending and beginning spaces (yes, this is needed)
    .match(/\s/g) // find all spaces by regex
    .length // get amount of matches
Riki137
fonte
1
let leng = yourString.split(' ').filter(a => a.trim().length > 0).length
Tim
fonte
6
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código.
Isma
1

Não tenho certeza se isso foi dito anteriormente ou se é o que é necessário aqui, mas você não poderia transformar a string em um array e depois encontrar o comprimento?

let randomString = "Random String";

let stringWords = randomString.split(' ');
console.log(stringWords.length);
brianna124
fonte
1

Acho que esta resposta dará todas as soluções para:

  1. Número de caracteres em uma determinada string
  2. Número de palavras em uma determinada string
  3. Número de linhas em uma determinada string

 function NumberOf() { 
		 var string = "Write a piece of code in any language of your choice that computes the total number of characters, words and lines in a given text. \n This is second line. \n This is third line.";

		 var length = string.length; //No of characters
		 var words = string.match(/\w+/g).length; //No of words
		 var lines = string.split(/\r\n|\r|\n/).length; // No of lines

		 console.log('Number of characters:',length);
		 console.log('Number of words:',words);
		 console.log('Number of lines:',lines);


}

NumberOf();

  1. Primeiro você precisa encontrar o comprimento da string dada por string.length
  2. Então você pode encontrar o número de palavras combinando-as com string string.match(/\w+/g).length
  3. Finalmente você pode dividir cada linha assim string.length(/\r\n|\r|\n/).length

Espero que isso possa ajudar aqueles que estão procurando por essas 3 respostas.

LiN
fonte
1
Excelente. Por favor, mude o nome da variável stringpara outro. É confuso. Me fez pensar por um segundo string.match()é um método estático. Felicidades.
Tímido Agam
sim!! certo. @ShyAgam
LiN
1

A precisão também é importante.

O que a opção 3 faz é basicamente substituir todos os espaços em branco, exceto quaisquer espaços em branco por um +1e, em seguida, avalia isso para contar os 1dando a você a contagem de palavras.

É o método mais preciso e rápido dos quatro que fiz aqui.

Observe que é mais lento do que return str.split(" ").length; mas é preciso quando comparado ao Microsoft Word.

Veja as operações de arquivo / s e a contagem de palavras retornadas abaixo.

Aqui está um link para executar este teste de bancada. https://jsbench.me/ztk2t3q3w5/1

// This is the fastest at 111,037 ops/s ±2.86% fastest
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function WordCount(str) {
  return str.split(" ").length;
}
console.log(WordCount(str));
// Returns 241 words. Not the same as Microsoft Word count, of by one.

// This is the 2nd fastest at 46,835 ops/s ±1.76% 57.82% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function WordCount(str) {
  return str.split(/(?!\W)\S+/).length;
}
console.log(WordCount(str));
// Returns 241 words. Not the same as Microsoft Word count, of by one.

// This is the 3rd fastest at 37,121 ops/s ±1.18% 66.57% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function countWords(str) {
  var str = str.replace(/\S+/g,"\+1");
  return eval(str);
}
console.log(countWords(str));
// Returns 240 words. Same as Microsoft Word count.

// This is the slowest at 89 ops/s 17,270 ops/s ±2.29% 84.45% slower
var str = "All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy. All work and no play makes Jack a dull boy.";
function countWords(str) {
  var str = str.replace(/(?!\W)\S+/g,"1").replace(/\s*/g,"");
  return str.lastIndexOf("");
}
console.log(countWords(str));
// Returns 240 words. Same as Microsoft Word count.

Ste
fonte
1
function WordCount(str) {
    var totalSoFar = 0;
    for (var i = 1; i < str.length; i++) {
        if (str[i] === " ") {
            totalSoFar ++;
        }
    }
    return totalSoFar; 
}
console.log(WordCount("hi my name is raj));
Raj Chandak
fonte
2
Respostas apenas em código são geralmente desaprovadas neste site. Você poderia editar sua resposta para incluir alguns comentários ou explicações sobre seu código? As explicações devem responder a perguntas como: O que isso faz? Como isso faz? Onde isso vai? Como isso resolve o problema do OP? Veja: Como responder . Obrigado!
Eduardo Baitello de
0
<textarea name="myMessage" onkeyup="wordcount(this.value)"></textarea>
<script type="text/javascript">
var cnt;
function wordcount(count) {
var words = count.split(/\s/);
cnt = words.length;
var ele = document.getElementById('w_count');
ele.value = cnt;
}
document.write("<input type=text id=w_count size=4 readonly>");
</script>
Sk Mourya
fonte
0

Eu sei que é tarde, mas esta regex deve resolver seu problema. Isso corresponderá e retornará o número de palavras em sua string. Em vez disso, aquele que você marcou como solução, que contaria espaço-espaço-palavra como 2 palavras, embora na verdade seja apenas 1 palavra.

function countWords(str) {
    var matches = str.match(/\S+/g);
    return matches ? matches.length : 0;
}
Reality-Torrent
fonte
0

Você cometeu alguns erros em seu código.

function WordCount(str) {
    var totalSoFar = 0;
    for (var i = 0; i < str.length; i++) {
        if (str[i] === " ") {
            totalSoFar += 1;
        }
    }
    return totalSoFar + 1; // you need to return something.
}
console.log(WordCount("Random String"));

Existe outra maneira fácil de usar expressões regulares:

(text.split(/\b/).length - 1) / 2

O valor exato pode diferir em cerca de 1 palavra, mas também conta as bordas das palavras sem espaço, por exemplo "palavra-palavra.palavra". E não conta palavras que não contenham letras ou números.

Aloso
fonte
0
function totalWordCount() {
  var str ="My life is happy"
  var totalSoFar = 0;

  for (var i = 0; i < str.length; i++)
    if (str[i] === " ") { 
     totalSoFar = totalSoFar+1;
  }
  totalSoFar = totalSoFar+ 1; 
  return totalSoFar
}

console.log(totalWordCount());
Piyusha Patel
fonte
Adicione algumas explicações editando sua resposta, evite responder apenas código
GGO