我試圖從字符串中刪除停用詞的列表。該列表使用$ .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");
}
您的$ get需要onsuccess事件。異步加載。 – Mistergreen
'$ .get()'是**異步**。當HTTP請求完成時,您傳入的回調將被調用,但對$ .get()的調用本身立即返回。基本上,你的代碼中的大部分工作都應該在回調中完成。 – Pointy
@Mistergreen是正確的,只是爲了更清楚一點:代碼中的所有內容都能正常工作,問題在於,您的函數並沒有等待您的$ .get調用在運行其餘代碼之前完成,因此您的代碼會保留運行並且您的stop_word尚未填充。因此,將您的代碼添加到成功回調函數中。 – phobia82