扫描特定的div并显示3个最常用的单词

时间:2011-09-29 14:15:17

标签: javascript jquery

这是我的标记:

<body>
  <div id="headbox">
    <p>Whatever...</p>
  </div>
    <div id="feed">
    <div>
    <p>I hate cats</p>
    </div>
    <div>
    <p>I like cats</p>
    </div>
    <div>
    <p>I like cats</p>
    </div>
    <div>
    <p>I like cats</p>
    </div>
  </div>
</body>

这笔交易是我需要一个脚本来计算<div id="feed">中出现的所有单词。

输出应包含在<p>标记或<span>标记中。

<h3>The top 3 used words in this feed:</h3>
1.&nbsp;<p>cats</p>&nbsp;4x
2.&nbsp;<p>like</p>&nbsp;3x
3.&nbsp;<p>hate</p>&nbsp;1x

这将是输出。

正如您所看到的那样(或更好的字母)I未被考虑。计数不会考虑3个字母以下的每个字。

3 个答案:

答案 0 :(得分:8)

只需循环遍历innerHTML,在空格上拆分文本,并使用结果数组的每个值添加或更新由找到的单词索引的主数组,其值为单词的计数。

答案 1 :(得分:5)

按空格分割目标元素的内部文本,计算单词频率,按最频繁排序,并根据您的要求格式化前3个。

像这样(未经测试):

var getMostFrequentWords = function(words) {
  var freq={}, freqArr=[], i;
  // Map each word to its frequency in "freq".
  for (i=0; i<words.length; i++) {
    freq[words[i]] = (freq[words[i]]||0) + 1;
  }
  // Sort from most to least frequent.
  for (i in freq) freqArr.push([i, freq[i]]);
  return freqArr.sort(function(a,b) { return b[1] - a[1]; });
};
var words = $('#feed').get(0).innerText.split(/\s+/);
var mostUsed = getMostFrequentWords(words);
// Now you can prepare "mostUsed.slice(0,3)" as the top 3 words/count.

你需要修改它以拒绝短于3个字符的单词,但你明白了。

答案 2 :(得分:3)

var text = document.getElementById('myDiv').textContent.split(' ');
var words = {};
text.forEach(function(n, i, ary){
    if(n.length > 3) {
        words[n] = (words[n] || 0) + 1;
    }
});

这就是我要对单词进行排序的方法。在HTML的某个地方,我将有一个用于自动编号的ol元素

var ol = document.getElementById('myOl');
var sorted_words = [];
for(var i in words) if(words.hasOwnProperty(i) {
    sorted_words.push([i, words[i]]);
}
sorted_words.sort(function(a, b){
    return  b[0] - a[0];
})
.reverse()
.slice(0, 3)
.forEach(function(n, i, ary){
    var li = document.createElement('li')
            .appendChild(document.createElement('p'))
            .textContent = n[1] + " " + n[0] + "x";
    ol.appendChild(ul);
});

这样的事情应该有用......