Проблема в том, что, как только вы splice
d извлекаете элемент из массива, ваша программа продолжает перебирать оставшийся внутренний массив, как если бы он еще существовал.В случае 3
в качестве вашей цели, каждый отдельный внутренний массив удаляется, потому что все они содержат 3
.При окончательном удалении вы обнаружите 3
по индексу 1
внутреннего массива и splice
по последнему внутреннему массиву.На следующей итерации цикла происходит сбой программы при попытке индексации в [0][2]
в пустом массиве []
.
. Решение состоит в том, чтобы добавить оператор break
следующим образом;это прервет дальнейшую проверку удаленного массива:
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === elem) {
arr.splice(i--, 1);
newArr = [...arr]
break;
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
Сказав это, есть много более простых подходов, которые вы можете использовать;например, используя array.filter()
, который выбирает элементы на основе значения истинности, возвращаемого его функцией аргумента:
const filteredArray = (a, target) => a.filter(e => !e.includes(target));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));