首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript数组和循环

Javascript数组和循环
EN

Stack Overflow用户
提问于 2012-04-27 03:24:42
回答 5查看 85关注 0票数 0

我正在为历史课做一个模拟审查谷歌。假设用户输入一个术语,脚本将检查它是“被阻止的”术语还是可搜索的术语。如果该术语被阻止,它将指向不同的页面,如果它是可搜索的,它将指向实际的页面。但是,在我的代码中,脚本不会提取被阻止的术语。有什么想法吗?

Javascript:

代码语言:javascript
复制
function searchCensor() 
{
    var keyTerms = document.getElementById("search").value; 
    var blockedTerms = new Array("censorship", "democracy");
    var counter, blocked;
    for(counter = 0; counter < blockedTerms.length; counter++) {
        if(keyTerms == blockedTerms[counter])
            blocked = 1;
        else
            blocked = 0;   
}
    switch(blocked)
    {
    case 1: window.location = "http://andrewgu12.kodingen.com/history/censor.php";
    case 0: window.location = "https://www.google.com/search?q="+keyTerms;
    }   
}

网址:http://andrewgu12.kodingen.com/history/

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-27 03:29:43

仔细考虑你的循环:

代码语言:javascript
复制
for(counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter])
        blocked = 1;
    else
        blocked = 0;
}

如果搜索词是“审查”,那么第一次通过循环将blocked设置为1。但第二次通过循环,它将查看“审查”并将其与“民主”进行比较,然后将blocked设置为0。这实际上只在最后一个被阻止的术语与查询匹配时才将blocked设置为1。

您真正想要的是,如果有任何被阻止的术语与查询匹配,则将blocked设置为1:

代码语言:javascript
复制
var blocked = 0;
for (var counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter]) {
        blocked = 1;
        break;    // Don't need to continue checking, we know it's blocked
    }
}

请注意,通常情况下,如果使用truefalse作为这种标志,而不是数字(如果blocked = 3,这意味着什么?什么都没有)。代码将变成:

代码语言:javascript
复制
var blocked = false;
for (var counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter]) {
        blocked = true;
        break;    // Don't need to continue checking, we know it's blocked
    }
}

if (blocked) {
    // ...
}
else {
    // ...
}

最后,如果您打算在由多个单词组成的查询中提取被审查的术语,您可以通过拆分搜索查询,然后检查这些术语中的任何一个是否被阻止(使用嵌套循环)来实现。或者,您可以使用正则表达式并完全消除循环:

代码语言:javascript
复制
var blocked =
    new RegExp('\\b' + blockedTerms.join('\\b|\\b') + '\\b', 'i')
    .test(keyTerms);
票数 2
EN

Stack Overflow用户

发布于 2012-04-27 03:29:16

只有当你的最后一个被阻止的术语匹配时,这才会起作用。

您需要修改for循环,使其在找到匹配项时中断:

代码语言:javascript
复制
for(counter = 0; counter < blockedTerms.length; counter++) {
    if(keyTerms == blockedTerms[counter])
    {
        blocked = 1;
        break;
    }
    else
        blocked = 0;   
}
票数 1
EN

Stack Overflow用户

发布于 2012-04-27 03:29:06

试试这个:

你应该:如果你发现阻塞就停下来,或者只是升起一面旗帜,永远不要再碰它(就像你做的那样)

首先我评估:blocked=0; //未被阻止

如果循环发现它的阻塞-所以阻塞得到'1‘。并保持为'1‘。

代码语言:javascript
复制
function searchCensor() 
{
    var keyTerms = document.getElementById("search").value; 
    var blockedTerms = new Array("censorship", "democracy");
    var counter, blocked=0;
    for(counter = 0; counter < blockedTerms.length; counter++) {
        if(keyTerms == blockedTerms[counter])
            blocked = 1;

}
    switch(blocked)
    {
    case 1: window.location = "http://andrewgu12.kodingen.com/history/censor.php";
    case 0: window.location = "https://www.google.com/search?q="+keyTerms;
    }   
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10340013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档