如何检查数组中的元素是否在另一个数组中? (嵌套for循环)

时间:2017-09-19 22:53:14

标签: javascript html arrays for-loop

这绝对不是进行此验证的最佳方法,但此方法必须这样做。

即使我对textArea有一个有效的十六进制输入,例如4A,3B等,下面的代码也会返回false。

非常感谢任何帮助!

        var userCode = [];
        // Code below parses all of the data to one long string with no spaces in upper case.
        var userCodeInput = document.getElementById("taProgramInput").value.split(" ").join("").toString().toUpperCase();
        var hexChar = ["A", "B", "C", "D", "E", "F", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
        var validHex;
        // Populate the userCode array by looping through the userCodeInput's length.
        for (i = 0; i < userCodeInput.length; i++) {
            userCode[i] = userCodeInput[i];
        }
        // Compare each element of the userCode array with each valid hex character.
        for (j = 0; j < hexChar.length; j++) {
            for (k = 0; k < userCode.length; k++) {
                if (hexChar[j] !== userCode[k]) {
                    validHex = false;
                    break;
                } else {
                    validHex = true;
                }
            }
        }

        if (validHex === false) {
            _StdOut.putText("Invalid hex, valid hex characters include A-F and/or 0-9");
        } else {
            // Accepted command
            _StdOut.putText("Valid Hex")
        }

4 个答案:

答案 0 :(得分:0)

这是一个简洁的功能,可以为您检查:

function isHex(userCode) {
   var paresedUserCode = parseInt(userCode, 16);
   return (paresedUserCode.toString(16) === userCode.toLowerCase())
}

我根据你的命名风格命名变量,但作为奖励提示,我要补充一点,使用这样的大写字母更适合于函数名而不是变量名,这使代码更难读取。

答案 1 :(得分:0)

我认为你已经让它变得更复杂了。 您可以替换用户输入中的所有非十六进制字符,并检查结果字符串是否与原始字符串具有相同的长度。

以下是一个例子:

function validHex(value){
  var onlyHex = value.toUpperCase().replace(/[^A-F0-9]/g, "");
  return onlyHex.length == value.length;
}

checkBtn.onclick = function(){
  console.log(validHex(hexInput.value));
}
<textarea id="hexInput"></textarea>
<br>
<button id="checkBtn">Check</button>

这可能效率不高,但需要的代码更少,而且更容易理解。

如果您希望使用数组方法,则可以遍历用户输入字符串中的每个字符,并检查这些字符中是否有任何字符不是可接受的十六​​进制字符。

以下是一个例子:

var hexArray = ["A", "B", "C", "D", "E", "F", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
var userInput = ....; 
var validHex = userInput.length;// initially 'true' if the user has inputed something.
for(var i = 0; i < userInput.length; i++){
    if(hexArray.indexOf(userInput[i]) == -1){ // not hex
        validHex = false;
        break;
    }
}

答案 2 :(得分:0)

您可以将parseInt函数与第二个参数一起使用,并指定数字系统(它的数值,因此16代表十六进制)。 由于我没有看到第一个循环中的点(填充数组userCode),我在这里只使用一个循环,但你仍然应该明白这一点。

var validHex = true;
for (var i = 0; i < userCodeInput.length; i++) {
     if (!isValidHex(userCodeInput[i])) validHex = false;
}

function isValidHex(char) {
    var decoded  = parseInt(char, 16);
    if (char.toString() === decoded.toString()) return true;
    return false;
}

它应该在这里完成工作。或者你可以在这里采用正则表达式方法:

function isValidHex(char) {
    return /^[0-9A-F]+$/g.test(char);
}

答案 3 :(得分:0)

您可以使用indexOf

let validHex = true;
for (let k = 0; k < userCode.length; k++) {
    if (hexChar.indexOf(userCode[k]) === -1) {
        validHex = false;
        break;
    }
}

您也可以尝试将十六进制字符串转换为int:

let validHex = parseInt(userCodeInput, 16) !== NaN;