Удалить подмассив в массиве в JavaScript с помощью цикла for
Мне нужно удалить подмассив, если у него есть определенный элемент.
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]
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));
Код выше работает нормально, если элемент найден только один раз (например, 19). Но если я попробую номер 3, я получу: Uncaught TypeError: Невозможно прочитать свойство 'length' из undefined Может кто-нибудь объяснить, что здесь происходит? Я был бы очень признателен. Спасибо!
3 ответа
С помощью filter()
с includes()
достаточно кратко, вам, вероятно, не нужна отдельная функция:
let array = [[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]]
let filtered = array.filter(item => !item.includes(19));
console.log(filtered)
Попробуйте Array.filter()
function filteredArray(arr, skip) {
return arr.filter(function(sub) {
return -1 === sub.indexOf(skip);
});
}
var mixed = [[3, 2, 3], [1, 6, 2], [3, 13, 26], [19, 3, 9]];
console.log(filteredArray(mixed, 19));
console.log(filteredArray(mixed, 3));
Проблема в том, что, как только вы splice
Если элемент вне массива, ваша программа продолжает перебирать оставшийся внутренний массив, как если бы он еще существовал. В случае 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));