2016-11-26 62 views
0

我試圖從字符串中刪除停用詞的列表。該列表使用$ .get在下面的第3行加載。 如果我嘗試在$ .get函數內部使用console.log(stop_words),我可以檢索數據。但是它們不會以某種方式添加到數組stop_words中,以便我可以使用$ .get函數之外的數據。JavaScript加載txt單詞列表將不會填充數組

注:下面的代碼工作正常,如果我直接在原型中聲明數組的值。

如何以這種方式將數據分配給stop_words數組,以便在$ .get函數之外使用它?

String.prototype.removeStopWords = function() { 
    var stop_words = []; 
    $.get('rsc/stopord.txt', function(data) { 
     stop_words = data.split('\n'); 
    }); 
    var x; 
    var y; 
    var word; 
    var stop_word; 
    var regex_str; 
    var regex; 

    var cleansed_string = this.valueOf(); 

    // Split out all the individual words in the phrase 
    words = cleansed_string.match(/[^\s]+|\s+[^\s+]$/g) 

    // Review all the words 
    for(x=0; x < words.length; x++) { 
     // For each word, check all the stop words 
     for(y=0; y < stop_words.length; y++) { 
      // Get the current word 
      word = words[x].replace(/\s+|[^a-z]+/ig, ""); // Trim the word and remove non-alpha 

      // Get the stop word 
      stop_word = stop_words[y]; 

      // If the word matches the stop word, remove it from the keywords 
      if(word.toLowerCase() == stop_word) { 
       // Build the regex 
       regex_str = "^\\s*"+stop_word+"\\s*$";  // Only word 
       regex_str += "|^\\s*"+stop_word+"\\s+";  // First word 
       regex_str += "|\\s+"+stop_word+"\\s*$";  // Last word 
       regex_str += "|\\s+"+stop_word+"\\s+";  // Word somewhere in the middle 
       regex = new RegExp(regex_str, "ig"); 

       // Remove the word from the keywords 
       cleansed_string = cleansed_string.replace(regex, " "); 
      } 
     } 
    } 
    return cleansed_string.replace(/^\s+|\s+$/g, ""); 
} 

function keywordDensity() { 
    var input = tinyMCE.activeEditor.getContent({format : "text"}); 
    input = input.replace(/(<([^>]+)>)/ig, "").replace(/,/g, "").replace(/-/g, "").replace(/"/g, "").replace(/'/g, "").replace(/\./g, " "); 
    input = input.toLowerCase(); 
    input = input.removeStopWords(); 
    console.log(input); 
    var keyword = $("#keyword").html(); 
    var wordCounts = { }; 
    var words = input.split(" "); 
    words = words.filter(Boolean); 

    for(var i = 0; i < words.length; i++) 
     wordCounts["_" + words[i]] = (wordCounts["_" + words[i]] || 0) + 1; 

    keysSorted = Object.keys(wordCounts).sort(function(a,b){return wordCounts[b]-wordCounts[a]}) 

    for(var i = 0; i < keysSorted.length; i++) { 
     keysSorted[i] = keysSorted[i].replace(/[_-]/g, ""); 
    } 

    var regexString = keysSorted[0]; 
    var regex = new RegExp("\\b" + regexString, 'g'); 
    var countMostUsed = input.match(regex, regexString); 
    console.log(input.match(regex, regexString)); 
    console.log("You use the word " + keysSorted[0] + " " + countMostUsed.length + " times"); 
    } 
+3

您的$ get需要onsuccess事件。異步加載。 – Mistergreen

+1

'$ .get()'是**異步**。當HTTP請求完成時,您傳入的回調將被調用,但對$ .get()的調用本身立即返回。基本上,你的代碼中的大部分工作都應該在回調中完成。 – Pointy

+0

@Mistergreen是正確的,只是爲了更清楚一點:代碼中的所有內容都能正常工作,問題在於,您的函數並沒有等待您的$ .get調用在運行其餘代碼之前完成,因此您的代碼會保留運行並且您的stop_word尚未填充。因此,將您的代碼添加到成功回調函數中。 – phobia82

回答

1

As @Mistergreen, @Pointy和@phobia82已經評論過,你需要在回調中進行處理。或者更好的是,在收到數據後,使用then

String.prototype.removeStopWords = function() { 

    var stop_words = []; 
    var self = this; 
    return $.get('stopword.txt', function(data) { 
     stop_words = data.split('\r\n'); 
    }).then(function(){ 
     var x; 
     var y; 
     var word; 
     var stop_word; 
     var regex_str; 
     var regex; 

     var cleansed_string = self.valueOf(); // note: we can't use this here 

     // Split out all the individual words in the phrase 
     words = cleansed_string.match(/[^\s]+|\s+[^\s+]$/g) 

     // Review all the words 
     //for(x=0; x < words.length; x++) { 
      // For each word, check all the stop words 
      for(y=0; y < stop_words.length; y++) { 
       // Get the current word 
       //word = words[x].replace(/\s+|[^a-z]+/ig, ""); // Trim the word and remove non-alpha 

       // Get the stop word 
       stop_word = stop_words[y]; 

       // If the word matches the stop word, remove it from the keywords 
       //if(word.toLowerCase() == stop_word) { 
        // Build the regex 
        regex_str = "^\\s*"+stop_word+"\\s*$";  // Only word 
        regex_str += "|^\\s*"+stop_word+"\\s+";  // First word 
        regex_str += "|\\s+"+stop_word+"\\s*$";  // Last word 
        regex_str += "|\\s+"+stop_word+"\\s+";  // Word somewhere in the middle 
        regex = new RegExp(regex_str, "ig"); 

        // Remove the word from the keywords 
        cleansed_string = cleansed_string.replace(regex, " "); 
       // } 
      } 
     //} 
     return cleansed_string.replace(/^\s+|\s+$/g, ""); 

    }); 
} 

注:我不知道爲什麼你需要在String個人words迭代。所以我已經評論了這一部分。你可以找到工作代碼here

你需要改變你調用函數的方式,如下所示。

"abc test1 test2 xyz".removeStopWords().then(function(data){ 
    alert(data); // alerts "abc xyz" 
    // do rest of the processing that is dependent on the return value of `removeStopWords` 
}); 
+0

感謝一堆。我從來沒有做過任何事情,所以我花了一段時間才能完成這項工作。但現在它是完美的:D –

0

這是不推薦,因爲您的GET請求可以阻止你的腳本,直到它返回一個結果,但根據記錄,你可以用它來代替$獲得():

$.ajax({ 
    url: 'rsc/stopord.txt', 
    success: function(data) { 
     stop_words = data.split('\n'); 
    }, 
    async: false 
}) 

編輯:

您的成功回調函數:

function(data) { 
    stop_words = data.split('\n'); 
} 

你傳遞給$ .get()調用。它在$ .get請求收到響應時調用,這可能需要一些時間... $ .get之後的代碼可以在調用回調之前運行,因此您的問題...