Удалить подмассив в массиве в JavaScript с помощью цикла for - PullRequest
0 голосов
/ 29 сентября 2018

Мне нужно удалить подмассив, если у него есть определенный элемент.

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 ]

0 голосов
/ 29 сентября 2018

Использование 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)
0 голосов
/ 29 сентября 2018

Проблема в том, что, как только вы 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));
0 голосов
/ 29 сентября 2018

Попробуйте 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));
...