Задать вопрос
@s24344

Как удалить вложенные массивы по условию?

Из такого массива:

const arr = [
  [{id: 1, value: "item 1"}, {id: 2, value: "item 3"}, {id: 3, value: "item 3"}, {id: 4, value: "item 4"}],
  [{id: 1, value: "item 1"}, {id: 2, value: "item 2"}, {id: 3, value: "-"}, {id: 4, value: "-"}],
  [{id: 1, value: "-"}, {id: 2, value: "-"}, {id: 3, value: "-"}, {id: 4, value: "-"}],
  [{id: 1, value: "item 1"}, {id: 2, value: "item 3"}, {id: 3, value: "item 3"}, {id: 4, value: "-"}],
  [{id: 1, value: "item 1"}, {id: 2, value: "item 3"}, {id: 3, value: "item 3"}, {id: 4, value: "item 10"}],
];

Необходимо получить такой:

const arrM = [
  [{id: 1, value: "item 1"}, {id: 2, value: "item 3"}, {id: 3, value: "item 3"}, {id: 4, value: "item 4"}],
  [{id: 1, value: "item 1"}, {id: 2, value: "item 3"}, {id: 3, value: "item 3"}, {id: 4, value: "item 10"}],
];

Т.е., оставить те элементы, в которых нет value: "-".
  • Вопрос задан
  • 174 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Как будем определять, должен ли элемент массива остаться:

const mustStay = arr => arr.every(n => n.value !== '-');

Собираем новый массив:

const newArr = arr.filter(mustStay);

// или

const newArr = [];
for (const n of arr) {
  if (mustStay(n)) {
    newArr.push(n);
  }
}

// или

const newArr = [];
for (let i = 0; i < arr.length; i++) {
  if (mustStay(arr[i])) {
    newArr[newArr.length] = arr[i];
  }
}

// или

const newArr = (function get(i, n = arr[i]) {
  return n
    ? [ mustStay(n) ? [ n ] : [], get(i + 1) ].flat()
    : [];
})(0)

Изменяем существующий:

for (let i = arr.length; i--;) {
  if (!mustStay(arr[i])) {
    for (let j = i; ++j < arr.length; arr[j - 1] = arr[j]) ;
    arr.pop();
  }
}

// или

arr.reduceRight((_, n, i, a) => mustStay(n) || a.splice(i, 1), null);

// или

arr.splice(0, arr.length, ...arr.filter(mustStay));

// или

arr.length -= arr.reduce((acc, n, i, a) => (
  a[i - acc] = n,
  acc + !mustStay(n)
), 0);
Ответ написан
Комментировать
potapchino
@potapchino
const arrM = arr.filter(subarr => !subarr.some(item => item.value === '-'))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы