2013-03-16 122 views
0

我正在寫一個簡單的數獨求解器,它需要一個數字1-9的數組,並將它們設置爲null,如果它們不適用於該單元格。一個例子是答案只能是5的單元格,所以所有的數字都被設置爲空,除了五。然後,我有一個clean()函數,它將從數組中刪除所有值爲空的值,但這不正確。原始數組是這個。array.splice在JavaScript中無法正常工作

[null,null,null,null,5,null,null,null,null] 

被清洗之後,返回

[null,null,5,null,null] 

JavaScript代碼是在這裏,而網格是數字的數獨網格

function mainmethod(){ 

     var onepos=oneposs(); 

    } 
    function oneposs(){ 

     var possibs=new Array(1,2,3,4,5,6,7,8,9); 
     for (var ycount=0;ycount<=8;ycount++){ 
      var value=grid[0][ycount]; 
      var index=possibs.indexOf(value); 
      possibs[index]=null; 

     } 
    //  for(var xcount=0;xcount<=8;xcount++){ 
    //  var value=grid[xcount][0]; 
    //  var index=possibs.indexOf(value); 
    //  possibs.splice(index,1); 
    // } 

     possibs=clean(possibs); 
     alert(JSON.stringify(possibs)); 
    } 
    function clean(array){ 
     for(var i=0;i<=8;i++){ 
      if(array[i]===null){ 
       array.splice(i,1); 
      } 
     } 
     return array; 
    } 

從本質上講,方法Array.splice不拼接它需要的一切,我不知道爲什麼

回答

6

你在迭代時改變數組。嘗試類似的東西:

function clean(array){ 
    for(var i=0;i<=8;i++){ 
     if(array[i]===null){ 
      array.splice(i--,1); 
     } 
    } 
    return array; 
} 

--較低的指數,因爲下一個項目後會有比你刪除的項目相同的指數。

此外,作爲參數傳遞的對象和數組是通過引用傳遞的,所以您不需要返回任何東西。你可以做clean(possibs);

+0

謝謝,它工作得很好。 – 2013-12-20 13:38:55

2

這是因爲當你「拼接」一個雷雨,指數變化。也許你可以試試這個代碼:

function clean(array){ 
    var x = []; 
    for(var i=0;i<array.length;i++){ 
     if(array[i]!=null){ 
      x.push(array[i]); 
     } 
    } 
    return x; 
} 
0

試試這個:

var array = [null,null,null,null,5,null,null,null,null]; 
for(var i=0;i<=array.length;){ 
    if(array[i] === null){ 
     array.splice(i,1); 
    } else if (array.length < 2) { 
     break; 
    } else { 
     i++; 
    } 
}