繁体   English   中英

检查输入是否在两个值之间(多个条件)

[英]Check if input is between two values (multiple conditions)

我正在制作一个项目,需要读取可以采用不同格式的数字,并对照用户输入检查这些数字。 在某些情况下,这将是一个间隔,例如“ 8800-9000”,在某些情况下,它将是一个4位数字,在某些情况下将是5位数字。

该数组如下所示:

var testArray = [
{
    "label": "Nordea",
    "value": ["1100-1199", "1400-2099", "3000-3399", "3410-4999"]
},
{
    "label": "Swedbank",
    "value": ["7000-7120", "7123-8104", "8106-8999"]
},
{
    "label": "Sparbanken Nord",
    "value": "8264"
},
{
    "label": "Sparbanken i Enköping",
    "value": ["7121-7122", "8305-5"]
}];

我做了一个巨大的嵌套if-mess,效果还不错。 我唯一的问题是找到匹配项时它不会中断。 如果我输入“ 8305-5”,它将在2个不同的对象属性数组中找到一个匹配项。 我是否设计了“之间”功能错误?

我也可以搜索比间隔大得多的数字,但仍然可以找到匹配项。 时间间隔“ 3410-3999”在数组中,如果我搜索“ 39999”,它仍然会匹配。

所有帮助非常感谢!

我遍历数组中的所有对象,如果值属性是一个数组,我将检查每个元素的长度,以查看是否应该匹配“介于”值或直接的“ ===”匹配。

如果不是数组,则尝试简单匹配。

function searchForClearing() {

  var userInput = document.getElementById("clearingnummerTextBox").value;

  for (var i in testArray) {
    var currentObject = testArray[i];

    if (Array.isArray(currentObject.value)) {

      for (i = 0; i < currentObject.value.length; i++) {

        if (currentObject.value[i].length === 9) {

          var firstInterval = currentObject.value[i].split('-')[0];

          var lastInterval = currentObject.value[i].split('-')[1];

          if (userInput >= firstInterval && userInput <= lastInterval) {
            console.log("Inmatat: " + userInput + " " + "Träff på: " + currentObject.value);
            document.getElementById("bankResult").innerHTML = currentObject.label;
            console.log("Sökte mellan intervallen: " + firstInterval + " - " + lastInterval);

            console.log("9 teckens sök");
          }

        } else if (currentObject.value[i].length === 6) {

          if (userInput == currentObject.value[i]) {
            console.log("Inmatat: " + userInput + " " + "Träff på: " + currentObject.value);
            document.getElementById("bankResult").innerHTML = currentObject.label;
            console.log("Sökte mellan intervallen: " + firstInterval + " - " + lastInterval);
            console.log("6 teckens sök");
          }
        }
      }
    } else {
      if (currentObject.value.length === 9) {

        var firstInterval = currentObject.value.split('-')[0];
        var lastInterval = currentObject.value.split('-')[1];

        if (userInput >= firstInterval && userInput <= lastInterval) {
          console.log("Inmatat: " + userInput + " " + "Träff på: " + currentObject.label);
          document.getElementById("bankResult").innerHTML = currentObject.label;
          console.log("Sökte mellan intervallen: " + firstInterval + " - " + lastInterval);
          return true;
        }

      } else if (currentObject.value.length === 4) {

        if (userInput == currentObject.value) {
          console.log("Träff på clearingnummer som inte var i en array: " + userInput + " " + currentObject.label);
          document.getElementById("bankResult").innerHTML = currentObject.label;
          return true;
        }

      }

    }
  }
}

即使“ 39999”超出了范围,它也返回true的原因是因为按字典顺序比较了JS中的字符串。

"39999" < "4999" // true
 39999  <  4999  // false

在进行比较之前,您需要使用parseInt之类的东西将字符串转换为数字。

至于减少一些嵌套的if乱,你的两个在这个例子中最好的朋友是Array.prototype.findArray.prototype.some

这两种findsome迭代数组要求每个元素的功能。

  • find :如果该函数返回true ,则find停止迭代并返回当前元素。 您可以使用它在testArray找到一个对象,该对象的value等于用户输入或包含在范围内。

  • some :如果该函数返回true ,则some停止迭代并返回true testArray值是一个数组时,可以使用它来检查用户输入是否在至少一个范围内。 我们使用some find而不是其他find因为我们只想检查数组中是否包含某些内容,而我们实际上并不希望将其取回。

这是使用findsome编写函数的方法:

function findTestObject(input) {

  // iterate over the test array and 
  // stop as soon we found a match 
  // (as the passed function returns true)
  return testArray.find(function (testObj) {
    var value = testObj.value;

    // if current value is an array of ranges
    // check if userInput is within at least one of the ranges
    if (Array.isArray(value)) {
      return value.some(function (range) {
        // split the current range into min and max and compare with user input
        var rangeData = range.split('-');
        return parseInt(rangeData[0]) <= input && input <= parseInt(rangeData[1]);
      });
    } 
    // otherwise do a direct comparison
    else {
      return value === input;
    }
  });
}

该函数将从testArray返回其值与用户输入匹配的第一个对象,或者返回undefined

这是一个完整的示例:

 var testArray = [{ "label": "Nordea", "value": ["1100-1199", "1400-2099", "3000-3399", "3410-4999"] }, { "label": "Swedbank", "value": ["7000-7120", "7123-8104", "8106-8999"] }, { "label": "Sparbanken Nord", "value": "8264" }, { "label": "Sparbanken i Enköping", "value": ["7121-7122", "8305-5"] }]; function findTestObject(input) { return testArray.find(function (testObj) { var value = testObj.value; if (Array.isArray(value)) { return value.some(function (range) { var rangeData = range.split('-'); return parseInt(rangeData[0]) <= input && input <= parseInt(rangeData[1]); }); } else { return value === input; } }); } function test() { var userInput = document.getElementById("input").value; var result = findTestObject(userInput); var label = result ? result.label : 'Not Found'; document.getElementById("result").innerHTML = label; } 
 <input id="input" placeholder="Enter something..."/> <button onclick="test()">Test</button> <br /> Result: <div id="result"></div> 

注意 :您的示例中存在不一致之处。 除了最后一个数组中的"8305-5"以外,所有范围都按"8305-5"排列(最小,最大)。 使用上面的代码,此范围将永远不会返回true。

解决此问题的一种方法是在比较之前始终按升序对范围数组进行排序。

var rangeData = range.split('-').sort();

有关示例和陷阱,请参见如何正确对整数数组进行排序

暂无
暂无

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

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