2016-11-12 4 views
1

나는 2 차원 배열의 숫자의 인덱스를 찾기 위해 노력하고 있지만, 콘솔다차원 배열 같이 IndexOf하지 JS 작업

catch되지 않은 형식 오류 밖으로 제공합니다. 블록 [((A * 10) + C)] 같이 IndexOf를 함수가 아닙니다.

배열 요소에 액세스하는 방법과 관련이 있다고 생각하지만 문제를 찾을 수 없습니다.

다음은 코드입니다.

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

먼저 I 할 것이다 :'CONSOLE.LOG (블록 [((a * 10) + c)]) '이 무엇인지를 참조한다. 그러나 좀더 구체적으로 말하면, 값은 아마도 객체이고 객체는'indexOf' 메쏘드를 가지고 있지 않다는 것을 의미합니다 ... 문자열은 저장하지만 아마도 문자열을 저장하지 않았을 것입니다. 또한,'prompt'에서 반환 된 모든 데이터가 문자열로 반환된다는 것을 기억하십시오. 숫자가 입력 된 경우에도 –

+0

숫자에는 indexOf() 메서드가 없음 – dandavis

+1

다차원 배열을 만들지 않으므로 * 블록 *은 단순한 배열입니다. 첫 번째 루프는 0에서 99 사이의 인덱스에 0에서 99까지의 단일 루프에서 수행 할 수있는 방식으로 요소를 삽입합니다. * block * 요소가 음수 값을 입력 할 경우에만 'typeof block [a] [b]! = "number"'. 그런 다음 블록 [a * 10 + c]에 액세스합니다. – RobG

답변

0

당신은 블록 배열에 할당 된 데이터 유형의 혼합을 가지고있다. 사용자가 숫자가 아닌 값을 입력하면 블록 요소 중 하나에 실제로 중첩 배열을 할당하지만 사용자가 유효한 숫자를 입력하면 실제로 할당하지 않습니다.

내가 생각하기에 (스도 코 게임?) 이것은 의도 한 것일 수 있습니다. 숫자는 그리드에서 알려진 값이고, 중첩 된 배열은 특정 셀에서 여전히 가능한 값 목록을 나타냅니다.

그러나 코드의 두 번째 부분에서 찾고있는 값이 실제로 배열 인 경우 배열 요소를 제거하려는 경우와 같이 두 경우 중 어느 것이 있는지 확인해야합니다. 이 테스트는 Array.isArray()과 함께 할 수 있습니다.

  • block[a][b]는 그 배열을 채운 방법과 일치하지 않습니다 표현 :이 일치하도록 block[a*10+b]해야

    또한 스크립트의 두 번째 부분에서 몇 가지 다른 문제가 있습니다.

  • b.indexOf(b)은 잘못되었습니다. 값은 찾고 있지 않지만, block[a*10+b]입니다.
  • splice()indexOf-1을 반환하더라도 항상 실행됩니다. splice()의 첫 번째 인수가 음수이면 인덱스는 실제로 배열의 끝에서부터 계산되며 여전히 배열에서 요소가 제거되므로 바람직하지 않은 결과를 초래합니다. 이것은 발생하지 않아야합니다. indexOf 결과가 음수가 아닌 경우에만 splice을 실행해야합니다.

아래는 거의 작동하지 않는 프롬프트를 피하기 위해이 스 니펫에 한 번에 전체 9x9 눈금을 입력 할 수있는 텍스트 영역을 제공 한 다음 코드의 실행을 시작합니다

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>

null을 유지 block의 요소가 있음. 당신이 이것을 의도했다고 가정합니다 : a에 10을 곱하고 "행"당 9 개의 값만 저장하면 항상 하나의 인덱스가 그대로 유지됩니다.

+0

대단히 고마워요! 프로그래밍에 익숙하지 않아서 큰 실수를 저질렀습니다. 그리고 네, 스도쿠 솔버입니다. –

+0

당신은 wecome입니다 ;-) – trincot

0

나는 두 번째로 for 루프를 살펴 보지 않았지만 내가 제공 한 스 니펫과 비슷한 로직을 적용 해 볼 수있다. 문제는 바깥 쪽 for 루프의 값이 a 인 임시 배열을 만들 필요가 있다는 것입니다 (그러나 안쪽에 중첩 된 for 루프의 값은 b입니다). 루프 내에서 b 값을 얻으려면 push을 임시 배열 (temp)에 넣어야합니다. 그런 다음 bfor 루프 외부에서 다음 반복주기가 a이되기 전에 임시 배열 tempblock 배열로 푸시합니다. 이 방법으로 2D 배열을 생성합니다.

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