Проблема в том, что вы не определяете i
с var
или let
.В этом случае i
является глобальной переменной и используется двумя функциями.
Поэтому, когда вызывается вложенная функция getIndex
, i
потенциально увеличивается до myarray.length
.Затем, когда выполнение возвращается в цикл первой функции, i
уже слишком велик, чтобы продолжать цикл.Цикл там выходит, и все сделано.
Вместо этого определите i
как локальную переменную функции (var
) или переменную блока (let
), и она будет работать:
function removeArray(toremove, myarray) {
for(let i = 0; i < toremove.length; i++) {
myarray.splice(getIndex(toremove[i], myarray), 1);
}
}
function getIndex(array, myarray){
for(let i = 0; i < myarray.length; i++){
if (typeof(array)== 'undefined') {
console.log("error");
return 100;
}
if ((myarray[i][0] == array[0]) && (myarray[i][1] == array[1])) {
console.log("found match at position " + i);
return i;
}
}
}
var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
var toremove=[[2,3],[3,3]];
console.log("before: " + JSON.stringify(myarray));
removeArray(toremove,myarray);
console.log("after: " + JSON.stringify(myarray));
Обычно рекомендуется не изменять массив с помощью splice
, а возвращать новую копию без элементов, которые необходимо удалить.Для этого вы можете использовать filter
и every
.И затем вы должны присвоить возвращаемое значение функции массиву, который должен иметь результат (может также перезаписать тот же массив):
function removeArray(toremove, myarray){
return myarray.filter(arr =>
toremove.every(rem => arr[0] != rem[0] || arr[1] != rem[1])
);
}
var myarray=[[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[2,4],[3,1],[3,2],[3,3],[3,4],[4,1],[4,2],[4,3],[4,4]];
var toremove=[[2,3],[3,3]];
console.log("before: " + JSON.stringify(myarray));
myarray = removeArray(toremove, myarray);
console.log("after: " + JSON.stringify(myarray));