2013-01-31 39 views
-1

總之,我試圖建立一個發誓過濾器,我有一個名爲「badWords」的靜態數組,其中包含許多褻瀆的詞。JavaScript將一個數組中的實例與整個其他數組進行比較?

然後,我的腳本將所有文本值從表單提取到另一個名爲「fieldValues」的數組中。

然後它遍歷fieldValues並將字符串值與「badWords」的整個數組進行比較,如果發現現在觸發一個簡單的響應。

代碼沒有產生任何錯誤,但它也沒有產生預期的輸出結果,我希望你能讓我知道我在哪裏出錯了。

代碼

// get all the inputs from "editor_form" 
var $inputs = $('#editor_form :input'); 

var fieldValues = new Array(); 
var i = 0; 

//for each field place it in array 
$inputs.each(function() 
{ 
    fieldValues[i] = $(this).val(); 
    i++; 
}); 

var swearWord; 
for (i = 0; i < fieldValues.length; i++) 
{ 
    if (fieldValues[i] == function() 
    { 
     //this bit i think is wrong, i think it only does one loop in this level then jumps back up 
     for (x = 0; x < badWords.length; x++) 
     { 
      return badWords[x]; 
     } 
    }) 

    //warning message 
    { 
     window.alert("Bad word found"); 
    }  
} 

感謝

+0

嗯爲什麼我的問題得到downvoted? – kaleeway

+0

我沒有downvote,但你注意到它的格式化得到了改進後,現在閱讀起來更容易嗎? –

+0

修正了上述問題之後,下一步如果用戶在同一個字段中輸入多個單詞,會發生什麼情況?你會得到一個''fieldValues'數組入口,其中包含一個像''三個壞字''這樣的字符串,但是將它與'badWords'數組中的一個字進行比較將不會匹配'=='。 – nnnnnn

回答

1

首先,您可以修復現有的代碼是這樣的:

function isBad(word) { 
    for (x = 0; x < badWords.length; x++) { 
     if (badWords[x]==word) return true; 
    } 
    return false; 
} 
for (i = 0; i < fieldValues.length; i++) { 
    if (isBad(fieldValues[i])) { 
     window.alert("Bad word found : " + fieldValues[i]); 
    } 
} 

但是你不好的話形成,在邏輯上,一組,而不是陣列。你應該使用一個對象作爲地圖來快速找到它們。

// build a set of the bad words 
var badWordsSet = {}; 
for (x = 0; x < badWords.length; x++) badWordsSet[badWords[x]]=true; 
// then use it 
for (i = 0; i < fieldValues.length; i++) { 
    if (badWordsSet[fieldValues[i]]) { 
     window.alert("Bad word found : " + fieldValues[i]); 
    } 
} 
+0

謝謝,我的集合按字母順序排序。爲了提高性能,我將在您的代碼中加入二進制搜索! :) – kaleeway

+0

你確定你需要它嗎?您應該先確定設置的解決方案,以確保您應該優化它。 Javascript訪問屬性非常快,是本地代碼。我真的不確定你的二進制搜索會更快。 –

+0

現在嗯有趣的問題,它實際上並沒有返回預期的結果。一個字段值被正確地傳遞給isBad()函數,forloop遍歷我的數組,但是評估似乎沒有正常工作。 – kaleeway

1

你認爲這個錯誤真的是錯誤的。您不應該將fieldValues[i]與您創建的功能進行比較,而是應該將該值依次與badWords中的每一個進行比較。不需要另一個功能,只需要一個內部循環。

相關問題