/ / array.splice nefunguje správne v javascripte - javascript, polia, zostrihy

array.splice nefunguje správne v jazyku javascript - javascript, arrays, splice

Píšem jednoduchý riešiteľ sudoku, ktorý trvápole čísel 1-9 a nastaví ich na null, ak to pre danú bunku nie je možné. Príkladom je bunka, kde odpoveď môže byť iba 5, takže všetky čísla sú nastavené na nulu, okrem piatich. Potom mám funkciu clean (), ktorá vymaže všetky hodnoty z poľa, ktoré sú null, ale to nefunguje správne. Pôvodné pole je toto.

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

Po vyčistení sa vráti

[null,null,5,null,null]

Je tu javascriptový kód a mriežka je mriežka čísel v sudoku

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 v podstate nespojuje všetko, čo potrebuje, a ja neviem prečo

odpovede:

6 pre odpoveď č. 1

Počas iterácie zmeníte pole. Skúste niečo také:

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

Na -- znížte index, pretože nasledujúca položka bude potom na rovnakom indexe ako položka, ktorú odstraňujete.

Navyše objekty a polia odovzdané ako argument sa odovzdávajú odkazom, takže nemusíte nič vrátiť. Môžete to urobiť clean(possibs);


2 pre odpoveď č. 2

Je to preto, že keď "spojíte" pole, zmení sa index. Možno môžete skúsiť tento kód:

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

0 pre odpoveď č. 3

skúste to:

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