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

时间:2013-03-16 23:24:06

标签: javascript arrays splice

我正在编写一个简单的数独求解器,它采用数字1-9的数组,并且如果它们不可能用于该单元格则将它们设置为空。一个例子是一个单元格,其中答案只能是5,所以所有数字都设置为null,除了5。然后,我有一个clean()函数,它删除数组中的所有值为null,但这是无法正常工作。原始数组就是这个。

[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没有拼接所需的一切,我不知道为什么

3 个答案:

答案 0 :(得分:6)

迭代时更改数组。尝试类似的东西:

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

--降低索引,因为下一个项目将与您要删除的项目位于相同的索引处。

此外,作为参数传递的对象和数组通过引用传递,因此您不需要返回任何内容。你可以clean(possibs);

答案 1 :(得分:2)

那是因为当你“拼接”数组时,索引会发生变化。也许你可以试试这段代码:

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

答案 2 :(得分: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++;
    }
}