繁体   English   中英

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

[英]How to check if an element in an array is in another array? (nested for loops)

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

即使我对 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")
        }

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

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

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

下面是一个例子:

 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;
    }
}

您可以使用带有第二个参数的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);
}

您可以使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM