-1

总之,我正在尝试构建一个发誓过滤器,其中我有一个名为“badWords”的静态数组,其中包含许多亵渎的词。

然后,我的脚本将表单中的所有文本值提升到另一个名为“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");
    }       
}

谢谢

4

2 回答 2

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]);
   }
}
于 2013-01-31T11:36:45.960 回答
1

您认为是错误的那一点确实是。您不应该fieldValues[i]与您创建的函数进行比较,而是应该将此值与每个值进行比较badWords。那里不需要另一个功能,只是一个内部循环。

于 2013-01-31T11:37:25.410 回答