【问题标题】:Problems with includes() function and array comparsion包含()函数和数组比较的问题
【发布时间】:2018-08-21 01:31:08
【问题描述】:

作为整个过程的一部分,我想将用户的输入(作为数组)与两个随机给定数组的并集进行比较。我不能使用 array.sort() 并逐个元素地比较数组,因为输入数组中只有一个不同的元素就足够了,并且在对多个元素进行排序后,将被识别为“错误的”(例如:数组“排序后的联合” = [11,13,17,18],排序后的数组“upis”(用户输入)= [7,11,13,18] 所以如果我逐个元素比较,我已经尝试过原始代码,所有前三个元素都被识别为错误...)

这就是为什么我已经切换到 array.includes() 并且我花了过去 5.5 个小时试图找出我错在哪里并且找不到它所以我有点生气......在几个小时内我应该在工作,但我因此而失去理智......

问题出在 checkInput() 函数中... 代码不会也不会识别“union”数组中的输入元素(数组“upis”)...可以不知道为什么???

任何帮助都将不胜感激!

<script>
  //-----------  1.) Kreiraj dva nasumična niza i uniju  -----------
  var arrA = []; //od 3 do max 6 članova
  var arrB = []; //od 2 do max 5 članova
  while (arrA.length < Math.floor(Math.random() * 4) + 3) {
    var randomnumber = Math.floor(Math.random() * 20) + 1;
    if (arrA.indexOf(randomnumber) > -1) continue;
    arrA[arrA.length] = randomnumber;
  }
  while (arrB.length < Math.floor(Math.random() * 4) + 2) {
    var randomnumber = Math.floor(Math.random() * 20) + 1;
    if (arrB.indexOf(randomnumber) > -1) continue;
    arrB[arrB.length] = randomnumber;
  }
  var union = [...new Set([...arrA, ...arrB])];
  document.write("A = " + arrA + "<br>");
  document.write("B = " + arrB + "<br>");

  //-----------  2.) Funkcija za dodavanje text box-ova  -----------
  function addFields() {
    // Broj text box-ova koje treba kreirati
    var number = union.length;
    // <div> u koji će se dinamično dodati text box-ovi
    var container = document.getElementById("container");
    // Obriši prethodni zapis u <div>
    while (container.hasChildNodes()) {
      container.removeChild(container.lastChild);
    }
    // Tekst A U B
    //container.appendChild(document.createElement("br"));
    container.appendChild(document.createTextNode("A ∪ B = "));
    for (i = 0; i < number; i++) {
      // Kreiraj <input> element i definiraj stil
      var input = document.createElement("input");
      input.type = "text";
      input.id = "element" + i;
      input.style.width = 25;
      container.appendChild(input);
      // Dodaj zarez poslije svakog input box-a, osim posljednjeg
      if (i < number - 1) {
        container.appendChild(document.createTextNode(", "));
      }
    }
    // Pokaži gumb Provjeri
    document.getElementById("provj").style.visibility = "visible";
  }

  //-----------  3.) Provjera upisa  -----------
  function checkInput() {
    var upis = [];
    var greske = [];
    // Pohrani upis u niz
    for (i = 0; i < union.length; i++) {
      var privr = document.getElementById("element" + i).value;
      upis.push(privr);
    }

    for (i = 0; i < upis.length; i++) {
      // ako je neko polje nepopunjeno, obavijesti i prekini petlju
      if (upis[i] === "") {
        alert("Treba upisati sve članove unije skupova!");
        greske = [];
        //npr. prva dva upisa kriva, ostala polja nepopunjena - iako ima
        //praznih polja, prekida se procedura ali se kod prva dva upisa
        //popunio niz greške i onda će ih pokazati
        break;
      }
      // u protivnom
      else {
        var n = union.includes(upis[i]);
        alert(upis[i] + " " + n);
        if (n === false) {
          greske.push(upis[i]);
        } else {
          //ništa
        }
      }
    }
    if (greske.length > 0) {
      alert("Krivo upisani članovi: " + greske);
    }
  }

</script>

<div id="container">
  <button onclick="addFields()">Upiši članove unije</button>
</div>
<button id="provj" style="visibility:hidden" onclick="checkInput()">Provjeri</button>

【问题讨论】:

    标签: arrays include comparison


    【解决方案1】:

    您正在将数字与strings 进行比较。只需将+ 添加到includes 参数即可:

    var n = union.includes(+upis[i]);
    

    这将强制字符串为 unboxed 作为数字,您的 includes 将按预期工作。

    您的另一个选择是将这些字符串转换为数字,然后就不需要unboxing

    【讨论】:

    • Akrion,你拯救了我的一天!!!!愚蠢的愚蠢的我:-(我几乎整晚都在寻找错误,我什至没有想到这些是文本输入,而不是数字!!!!我感激不尽!
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多