Word frequency for array of key/values on javascript

diegodacal

I'm trying to implement a piece of code on javascript to analyse word/frequency on a given string. My objective is to return a array as the following:

[{text: firstword, size:3 },{text:secondword , size:5 },{text: nword, size: 1},...]

I implemented the following code but I'm running out of memory, so I don't really know if its ok or not.

function wordFrequency(txt){
    var wordArray = txt.split(/[ .?!,*'"]/);
    var newArray = [];
    $.each(wordArray, function (ix, word) {
        if (newArray.length >= 1){
            newArray.some(function (w){
                if (w.text === word){
                    w.size++;
                } else {
                    newArray.push({text: word, size: 1});
                }
            });
        } else {
            newArray.push({text: word, size: 1});
        }
    });
    return newArray;
}
LJᛃ

Array.prototype.some expects the given callback to return true or false and returns true as soon as your callback returns true for a given element, otherwise it returns false.

So some iterates over all elements, with your given callback, and your callback checks if the given element text equals the search word and if not adds a new object. Introducing a new element the some function can iterate over.

So to make this clear, for every word thats in the newArray before the word you're searching, you're adding a new object containing your word.

Suppose your newArray looks like this:

[{word:"test"},{word:"another"},{word:"one"},{word:"more"}]

after calling your function for the word even it looks like this:

[{word:"test"},{word:"another"},{word:"one"},{word:"more"},{word:"even"},{word:"even"},{word:"even"},{word:"even"}]

Using Array.prototype.filter would be the better approach here, finding you the matching element, note that I also replaced $.each with Array.prototype.forEach:

function wordFrequency(txt){
  var wordArray = txt.split(/[ .?!,*'"]/);
  var newArray = [], wordObj;
  wordArray.forEach(function (word) {
    wordObj = newArray.filter(function (w){
      return w.text == word;
    });
    if (wordObj.length) {
      wordObj[0].size += 1;
    } else {
      newArray.push({text: word, size: 1});
    }
  });
  return newArray;
}
document.write(JSON.stringify(wordFrequency("count everything, count all the words, count all the words!").sort(function(a,b){return a.size<b.size})).split("},").join("}<br/>"));

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

(Fast) word frequency matrix in R

분류에서Dev

Get word frequency of pandas column containing lists of strings

분류에서Dev

R: TM package Finding Word Frequency from a Single Column

분류에서Dev

Match letter frequency within a word against 26 letters in R (or python)

분류에서Dev

How to filter results based on frequency of repeating terms in an array in elasticsearch

분류에서Dev

jQuery/javascript specific word detect

분류에서Dev

Prompt for 5 words then display longest word javascript

분류에서Dev

Using an array to filter an array Javascript

분류에서Dev

C# array to javascript array

분류에서Dev

JavaScript JQuery array loop

분류에서Dev

Javascript memoize find array

분류에서Dev

Pass a java array to javascript

분류에서Dev

Javascript array of objects undefined

분류에서Dev

Javascript Array undefined?

분류에서Dev

Sort array of days in javascript

분류에서Dev

Ajax PHP/Javascript array

분류에서Dev

Pass an object into an array in JavaScript

분류에서Dev

Create stacked array with javascript

분류에서Dev

Javascript Initialise Image Array

분류에서Dev

Convert array to string Javascript

분류에서Dev

javascript random item in array?

분류에서Dev

JavaScript override array method

분류에서Dev

array reference javascript angular

분류에서Dev

JavaScript array access issues

분류에서Dev

Array incompatibility Javascript

분류에서Dev

Javascript String to Nested Array

분류에서Dev

javascript sum multidimensional array

분류에서Dev

JavaScript Copy Array By Value

분류에서Dev

Javascript array length of 0