Как отфильтровать массив массивов из массива объектов? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь отфильтровать массив массивов объектов, но он не работает.

   constructNewGrid(filterText){
      if(searchText == ""){
        this.constructedGrid = this.fullGrid;
        return;
      }
      this.constructedGrid = [];
      this.constructedGrid = this.fullGrid.filter(array => array.filter(obj => {
        if(obj.name == filterText)
          return obj;
      }));
      console.log(this.constructedGrid);
   }

Я хочу вернуть массив массивов с правильным объектом, если он найден, но когда я консольный журнал это constructedGrid тот же массив, но почему? Код должен go к первому массиву проверять, есть ли объект с именем, равным тексту фильтра, он должен возвращать массив с соответствующим объектом, а затем проверять следующий массив и так далее.

Это будет формат:

[ 
  [[{name: string}], empty, empty], // array of lenth 3 
  [empty, empty, [{name: string}], empty], // array of length 4 
   ... 
]

Если найден один объект, он должен вывести sh в массив отдельно, так что если два объекта находятся в одном массиве, он должен поместить их обоих в отдельные pu sh их в два отдельных массива, и они должны быть в одном массиве: результат должен быть

[
 [[obj1]],
 [[obj2]],
 ...
]

Это представляется возможным для меня. Иногда я получаю сообщение об ошибке, что у меня недостаточно памяти, ха-ха ...

1 Ответ

1 голос
/ 24 апреля 2020

Вам понадобится 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 будут пропущены. Опять же, новая функция, вам нужно проверить поддержку в ваших целевых браузерах, если вы не переносите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...