2016-02-21 2 views
2

Я пытаюсь подсчитать слова в каждом предложении из длинной строки. Я получаю только количество предложений. Я нашел некоторое решение в C# и Ruby, но они не для меня :-))подсчет слов каждого предложения в длинной строке, jquery

Я действительно новичок в java-script. Любая помощь очень ценится. Ниже код:

выход по:

Слова: 1 в посылаемых: 1 слов: 0 в посылаемых: 2 Слова: 1 в посылаемых: 3 Слова: 1 в отправлено: 4 слова : 1 в отправленных: 5 Words: 1 в отправленных: 6

слово счетчик не увеличивается! Скорее всего, это что-то простое. Спасибо заранее.

var text1 = $('#textarea1').val(); 
var gaps = []; 
var wordsC = 0; 
var wordsTot = 0; 
var tempC = 0; 
var sents = text1.split('.');  

for (var elem in sents) 
{ 
    tempC += 1; 

    wordsC = elem.split(" ").length; 
    wordsTot += wordsC; 

    if (tempC == 2) { 
     wordsC -= 1; 
     wordsTot -= 1; 
    } 

    document.write("<br />Words: " + wordsC + " |in sent: " + tempC + " sent"); 
}; 

document.write("<br />words total : " + wordsTot + "<br />"); 
+0

Несколько примечаний, [не используйте 'for ... in' для повторения массивов] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for ... в # Array_iteration_and_for ... in), он предназначен для итерации над свойствами объекта; использование его на массивах может сделать неожиданные вещи. В случае, если вы не знаете, JS использует область функций, используя 'var' для определения' elem' в вашем '' for' -запросе, не ограничивает его область применения циклом. [Не используйте 'document.write'] (http://www.youtube.com/watch?feature=player_detailpage&v=Y2Y0U-2qJMs#t=1082s), вместо этого используйте' console.log() '. –

ответ

1

Вы не должны перечислять массив с for...in. text1.split('.'); создает массив, который вы пытаетесь перечислить с помощью for...in. Значение elem на каждой итерации for...in является одним из индексов массива в виде строки ('0' на первой итерации, '1' на второй и т. Д.). Вы даже закончите с некоторыми из методов прототипа Array и других вещей до изменения прототипа.

Для предварительных условий ES6, попробуйте:

for (var i = 0; i < sents.length; i++) 
{ 
    tempC += 1; 

    wordsC = sents[i].split(" ").length; 
    wordsTot += wordsC; 

    if (tempC == 2) { 
     wordsC -= 1; 
     wordsTot -= 1; 
    } 

    document.write("<br />Words: " + wordsC + " |in sent: " + tempC + " sent"); 
} 

ES6 ввел for...of конструкцию, которая делает то, что вы пытаетесь сделать:

for (let elem of sents) 
{ 
    tempC += 1; 

    wordsC = elem.split(" ").length; 
    wordsTot += wordsC; 

    if (tempC == 2) { 
     wordsC -= 1; 
     wordsTot -= 1; 
    } 

    document.write("<br />Words: " + wordsC + " |in sent: " + tempC + " sent"); 
}; 
+0

Спасибо, Ной. Я буду помнить об этом. – ArtJ

1

var str = "There are five words here. I like turtles a lot. This is five words long. Yep."; 
 
var split = str.split("."); 
 
var amountOfSentences = str.charAt(str.length - 1) == "." ? split.length : split.length + 1; 
 
var total = 0; 
 

 
for (i = 0; i < amountOfSentences - 1; i++) { 
 
    $("body").append("Sentence " + (i + 1) + ": "); 
 
    for (j = 0; j < split[i].split(" ").length - 1; j++) { 
 
     total++; 
 
    } 
 
    if (i == 0) total++; 
 
    $("body").append(" " + total + "<br />"); 
 
    total = 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Здесь пять слов. Мне очень нравятся черепахи. Это пять слов. Ага.

Этот выход будет:

Предложение 1: 5
Предложение 2: 5
Предложение 3: 5
Предложение 4: 1

Конец предложения может закончиться с точкой или нет, это не имеет значения (учитывается в var amountOfSentences). Это сработает для вас?

+0

Отличная работа, Snorlax.Спасибо вам. – ArtJ

+0

@ArtJ Нет проблем!Пожалуйста, выберите мой ответ как правильный ответ и повысьте, если вы считаете, что это хорошо :) – MortenMoulder

+0

Они не позволяют мне голосовать. Извините Snorlax. – ArtJ

Смежные вопросы