Вам понадобится map
в дополнение к filter
, потому что filter
просто решает, сохранять ли то, что есть, оно не меняет , что там. map
делает. Примерно так:
this.constructedGrid = this.fullGrid
// Map the inner array to one that only has matching entries
.map(array => array.filter(obj => obj && obj.name === filterText))
// Remove blank inner arrays from the overall array
.filter(array => array.length);
Live Пример:
const fullGrid = [
[[{name: "target"}], , ],
[, null, [{name: "target"}], undefined],
];
const filterText = "target";
const constructedGrid = fullGrid
// Map the inner array to one that only has matching entries
.map(array => array.filter(obj => obj && obj[0] && obj[0].name === filterText))
// Remove blank inner arrays from the overall array
.filter(array => array.length);
console.log(constructedGrid);
.as-console-wrapper {
max-height: 100% !important;
}
Обратите внимание, что вам нужна эта секунда filter
, только если вы хотите удалить массивы, которые полностью пусты из внешнего массива. Если вы хотите оставить их, просто удалите этот звонок. Редактировать: Из вашего ответа на мой вопрос по этому вопросу звучит так, как будто вы хотите удалить эту секунду .filter
.
Обратите внимание на охрану в первом filter
, obj && obj[0] &&
часть. Это потому, что вы сказали, что иногда записи в массиве «пустые». Я не знаю, буквально ли вы имели в виду пустой - разреженный массив - или записи, которые undefined
. Если вы буквально имели в виду empty (разреженный массив), вам не нужна защита, но, вероятно, лучше иметь ее.
Начиная с ES2020, вы можете использовать дополнительный оператор сцепления вместо этого:
.filter(obj => obj?.[0]?.name === filterText)
obj?.[0]?.name
оценивается как undefined
, если obj
равно null
или undefined
, или obj[0]
равно null
или undefined
; в противном случае obj[0].name
. Поскольку undefined === filterText
будет ложным, записи с null
или undefined
obj
будут пропущены. Опять же, новая функция, вам нужно проверить поддержку в ваших целевых браузерах, если вы не переносите.