2016-11-12 1 views
1

Ich versuche, einen Index von einer Zahl in einer 2D-Array zu finden, aber Konsole gibt ausmehrdimensionales Array indexOf nicht funktioniert js

Uncaught Typeerror:. Block [((a * 10) + c)] indexOf ist keine Funktion

Ich denke, es hat etwas mit der Art des Zugriffs auf das Array-Element zu tun, aber scheint nicht das Problem zu finden.

Hier ist der Code.

var block = []; 
var temp; 
var del; 

for(var a = 0;a < 9;a++){ 
    for(var b = 0;b < 9;b++){ 
     temp = parseInt(prompt("enter element number " + b + " of row number " + a)); 
     console.log(temp); 
     if(temp>0){ 
      block[a*10+b] = temp; 
     }else{ 
      block[a*10+b] = [1,2,3,4,5,6,7,8,9]; 
     } 
//  console.log(block[a*10+b]); 
    } 
} 
for(var a = 0;a < 9;a++){ 
    for(var b = 0;b < 9;b++){ 
     if(typeof(block[a][b]) == "number"){ 
      for(var c = 0;c < 9;c++){ 
       if(c != b){ 
        del = block[a*10+c].indexOf(b); 
        block[a*10+c].splice(del,1); 
       } 
      } 

     } 

    } 
} 
+2

Erstens, ich tun würde: 'console.log (Block [((a * 10) + c)])', um zu sehen, was das ist. Genauer gesagt zeigt der Fehler, den Sie bekommen, an, dass der Wert wahrscheinlich ein Objekt ist und Objekte keine 'indexOf'-Methode haben ... Strings tun, aber Sie haben wahrscheinlich keine Zeichenkette gespeichert. Beachten Sie außerdem, dass ALLE von einer "Eingabeaufforderung" zurückgegebenen Daten als Zeichenfolge zurückgegeben werden. Selbst wenn eine Zahl eingegeben wurde. –

+0

Zahlen haben keine indexOf() -Methode – dandavis

+1

Sie erstellen kein mehrdimensionales Array, * block * ist nur ein einfaches Array. Die erste Schleife fügt Elemente in den Indizes 0 bis 99 in einer Weise ein, die in einer einzigen Schleife von 0 bis 99 möglich ist. Nur wenn Sie einen negativen Wert eingeben, wird ein Element von * block * ein Array sein [a] [b]! = "Nummer" '. Aber dann greifen Sie auf 'Block [a * 10 + c] '. – RobG

Antwort

0

Sie haben eine Mischung Arten von Daten an das Array Block zugeordnet. Wenn der Benutzer einen Wert eingibt, der nicht numerisch ist, weisen Sie einem der Elemente Block tatsächlich ein verschachteltes Array zu, jedoch nicht, wenn der Benutzer eine gültige Nummer eingibt.

Von was ich denke, Sie tun (ein Sudoko-Spiel?) Könnte dies beabsichtigt sein: die Zahlen sind bekannte Werte im Raster, die verschachtelten Arrays repräsentieren eine Liste von Werten, die noch in dieser bestimmten Zelle möglich sind.

Aber dann im zweiten Teil Ihres Codes sollten Sie prüfen, in welchem ​​der beiden Fälle Sie sind, wie Sie nur Array-Elemente entfernen möchten, wenn der Wert, den Sie betrachten, tatsächlich ein Array ist. Diesen Test können Sie mit Array.isArray() durchführen.

Es gibt auch einige andere Probleme im zweiten Teil des Skripts:

  • Der Ausdruck block[a][b] mit nicht konsistent ist, wie Sie das Array gefüllt haben: Es sollte block[a*10+b] sein, konsequent zu sein.
  • die b in .indexOf(b) ist falsch: Sie suchen nicht nach diesem Wert, aber für block[a*10+b].
  • die splice() wird immer ausgeführt, auch wenn die indexOf-1 zurückgegeben. Dies führt zu einem unerwünschten Effekt, denn wenn das erste Argument zu splice() negativ ist, wird der Index tatsächlich vom Ende des Arrays gezählt, und immer noch wird ein Element aus dem Array entfernt. Dies sollte nicht passieren: Sie sollten das splice nur ausführen, wenn das Ergebnis indexOf nicht negativ ist.

Unten habe ich eine funktionierende Version gesetzt haben, sondern um die fast endlosen Aufforderungen zu vermeiden, habe ich dieses Schnipsel mit einem Textfeld, wo Sie die Eingabe kann das komplette 9x9-Gitter in einem Rutsch, und dann eine Taste drücken, um die Ausführung des Codes starten:

document.querySelector('button').onclick = function() { 
 
    var block = []; 
 
    var temp; 
 
    var del; 
 
    var text = document.querySelector('textarea').value.replace(/\s+/g, ''); 
 
    for(var a = 0;a < 9;a++){ 
 
     for(var b = 0;b < 9;b++){ 
 
      temp = parseInt(text[a*9+b]); // <-- get char from text area 
 
      if(temp>0){ 
 
       block[a*10+b] = temp; 
 
      }else{ 
 
       block[a*10+b] = [1,2,3,4,5,6,7,8,9]; 
 
      } 
 
     } 
 
    } 
 
    for(var a = 0;a < 9;a++){ 
 
     for(var b = 0;b < 9;b++){ 
 
      var num = block[a*10+b]; // <-- get content, fix the index issue 
 
      if(typeof num == "number"){ 
 
       for(var c = 0;c < 9;c++){ 
 
        if(c != b && Array.isArray(block[a*10+c])){ //<-- add array-test 
 
         del = block[a*10+c].indexOf(num); // <-- not b, but num 
 
         if (del > -1) // <-- only splice when found 
 
          block[a*10+c].splice(del,1); 
 
        } 
 
       } 
 
      } 
 
     } 
 
    } 
 
    document.querySelector('pre').textContent = 'block='+ JSON.stringify(block); 
 
};
<textarea rows=9> 
 
53..7.... 
 
6..195... 
 
.98....6. 
 
8...6...3 
 
4..8.3..1 
 
7...2...6 
 
.6....28. 
 
...419..5 
 
....8..79 
 
</textarea> 
 
<button>Process</button> 
 
<pre></pre>

Beachten Sie, dass es Elemente in block die null bleiben. Ich nehme an, Sie haben das beabsichtigt: Wenn Sie a mit 10 multiplizieren und nur 9 Werte pro "Zeile" speichern, gibt es immer einen Index, der unberührt bleibt.

+0

Vielen Dank! Ich bin neu im Programmieren, also habe ich große Fehler gemacht. Und ja, es ist ein Sudoku-Löser. –

+0

Du bist willkommen ;-) – trincot

0

Ich habe nicht über Ihre zweite for Schleife geschaut, aber Sie können versuchen, ähnliche Logik dort wie in dem Ausschnitt, den ich bereitgestellt habe, anzuwenden. Das Problem ist, dass Sie ein temporäres Array innerhalb der äußeren for Schleife über Werte von a erstellen müssen (aber NICHT innerhalb der inneren, verschachtelten for Schleife über Werte von b).Innerhalb der for Schleife für Werte von b, dann müssen Sie push etwas in das temporäre Array (die ich temp genannt). Dann, außerhalb der bfor Schleife, aber vor der nächsten Iteration von a, drücken Sie das temporäre Array temp auf die block Array. Auf diese Weise erzeugen Sie ein 2D-Array.

var block = []; 
 
var del; 
 

 
for(var a = 0; a < 9; a++) { 
 
    let temp = []; 
 
    for(var b = 0; b < 9; b++) { 
 
    let num = parseInt(prompt(`Enter element ${b} of row ${a}:`)); 
 
    if (num > 0) { 
 
     temp.push(num); 
 
    } else { 
 
     // block[a*10+b] = [1,2,3,4,5,6,7,8,9]; 
 
     temp.push(b); 
 
    } 
 
    } 
 
    block.push(temp); 
 
}