array.splice在JavaScript中无法正常工作

问题描述:

我正在写一个简单的数独求解器,它需要一个数字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不拼接它需要的一切,我不知道为什么

你在迭代时改变数组。尝试类似的东西:

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

这是因为当你“拼接”一个雷雨,指数变化。也许你可以试试这个代码:

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

试试这个:

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