include()函数和数组比较的问题

时间:2018-08-21 01:31:08

标签: arrays include comparison

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

这就是为什么我切换到array.includes()的原因,并且我花了最后5.5个小时试图找出我在哪里错了,但是找不到它,所以我有点发疯了……在几个小时内我应该在上班,但是因为这个我迷失了方向...

问题在checkInput()函数之内... 该代码只是不会也不会识别“联合”数组中的输入元素(数组“ 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>

1 个答案:

答案 0 :(得分:0)

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

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

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

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