我有一个循环,通过一大串字符。检查每个数字与另一个字符串中的个别数字,并突出显示匹配...
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/
答案 0 :(得分:6)
嗯,你肯定是这么做的。请改用indexOf
(或者,正如Johan指出的那样,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>");
}
}
虽然这里有很多其他的清理建议,但至少循环更容易。
- 斯科特
答案 1 :(得分:1)
它只显示7个,因为你在第一次迭代中在内循环中使切换器= 1。
因此,当它出现7时,系统中的7将出现在systemPass var的0索引上,因此第一次迭代检查它是否存在并将其显示为绿色。但是对于所有人来说,除了银色和切换器显示为1之外的其他内容。
因此,您应该根据indexOf函数检查您的值。
答案 2 :(得分: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>");
});
答案 3 :(得分:1)
看看这个...... http://jsfiddle.net/J4wbk/26/
我认为这会有所帮助
说明: 您在内部循环内分配切换器= 1.因此,在第一次匹配后,切换器为1并且始终执行其他部分。 并且你得到多个字母,因为你将每个字母附加到内部循环内的decypher并且它被添加了systemPass.length次。
答案 4 :(得分: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>';
});
答案 5 :(得分: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>");
}