2

我有一个遍历一大串字符的循环。检查每个数字与另一个字符串中的单个数字并突出显示匹配...

var decypher = "782137829431783498892347847823784728934782389";

var systemPass = "789544";

for (var x = 0; x < decypher.length; x++) { //loop through the array
    var switcher = 0; //not run this row yet
    for (var p = 0; p < systemPass.length; p++) { //loop through each digit in the password
        if(eval(decypher[x]) === eval(systemPass[p])) { //if the password digit matches the array digit
            if (switcher === 0) { //not run yet...
                $('body').append("<p style='color: green; float: left;'>"+decypher[x]+"</p>");
                switcher = 1; //finished running
            }
        } else { //no match
            if (switcher === 0) { //not run yet...
                $('body').append("<p style='color: silver; float: left;'>"+decypher[x]+"</p>");
                switcher = 1; //finished running
            }
        } 
    }   
}

JSFiddle 示例:http: //jsfiddle.net/neuroflux/J4wbk/12/

我的问题是,为什么它只突出显示7's多年来我一直在为此挠头!

[编辑]
感谢“@Yograj Gupta” - 我已经删除了switcher变量,但现在我得到了每个字符的多个实例:http: //jsfiddle.net/neuroflux/J4wbk/22/

4

6 回答 6

6

好吧,你肯定是在艰难地做这件事。改用indexOf(或者,正如约翰指出的那样,jQuery.inArray):

http://jsfiddle.net/CrossEye/euGLn/1/

var decypher = "782137829431783498892347847823784728934782389";
var systemPass = "789544";

for (var x = 0; x < decypher.length; x++) {
    // if(systemPass.indexOf(decypher[x]) > -1) { // Thanks, Johan
    if ($.inArray(decypher[x], systemPass) > -1) {
        $('body').append("<p style='color: green; float: left;'>"+decypher[x]+"</p>");
    } else { //no match
        $('body').append("<p style='color: silver; float: left;'>"+decypher[x]+"</p>");
    } 
}

虽然这里有很多其他的清理建议,但至少循环更容易。

——斯科特

于 2012-09-26T11:35:28.830 回答
1

它只显示 7,因为您在第一次迭代中使 switcher = 1 处于内部循环中。

因此,当它出现 7 时,7 出现在 systemPass var 中的 0 索引上,因此第一次迭代检查它是否存在并将其显示为绿色。但无论如何,它会以银色显示,切换器在那里变成 1。

因此,您应该根据 indexOf 函数检查您的值。

于 2012-09-26T11:33:18.423 回答
1

像这样?还是我错过了什么?

var decypher = "782137829431783498892347847823784728934782389".split('');

var systemPass = "789544".split('');

$.each(decypher, function(i, v){

    if(systemPass.indexOf(v) !== -1)
        $('body').append("<p style='color: green; float: left;'>"+ v +"</p>");
    else
        $('body').append("<p style='color: silver; float: left;'>"+ v +"</p>");

});

http://jsfiddle.net/J4wbk/22/

于 2012-09-26T11:36:44.233 回答
1

看看这个... http://jsfiddle.net/J4wbk/26/

我认为这会有所帮助

说明:您在内部循环中分配 switcher = 1。因此,在第一次匹配后,切换器为 1,并且始终执行 else 部分。而且您会收到多个字母,因为您将每个字母都附加到内部循环内的解密器中,并且它被添加了 systemPass.length 次。

于 2012-09-26T11:45:10.397 回答
0

我在您的jsfiddle中进行了更改 我现在更新了我的代码它应该可以解决您的问题

var decypher = "782137829431783498892347847823784728934782389";

    var pass = 789544;
    pass = "" + pass; var temp = '';
    for(var k =0; k < pass.length; k++){
      temp += pass[k] + '|';
    }
    temp = temp.substring(0, temp.length-1) ;

    console.log(new RegExp(temp,'g'));

    document.body.innerHTML =decypher.replace(new RegExp(temp,'g'), function(a){

        return '<span>'+a + '</span>';

    });

​
于 2012-09-26T11:29:44.407 回答
0

检查这个小提琴:http: //jsfiddle.net/2HvwT/2/

注意:按照 Scott Sauyet 的建议,用 indexOf() 更新了小提琴

代码:

for (var x = 0; x < decypher.length; x++) { //loop through the array
    var found = systemPass.indexOf(decypher[x]);
    $('body').append("<p style='color: "+(found !== -1?'green':'silver')+"; float: left;'>"+decypher[x]+"</p>");
}
于 2012-09-26T11:36:34.773 回答