Angular - как динамически отфильтровать объекты, сравнивая 2 массива? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть массив объектов, которые я получаю из API с

observable: 
[{id: x, name: xx, age: yy}, {.....}, ...]

Затем я сопоставляю эти объекты своему пользовательскому модулю (окну поиска), чтобы вы могли вводить строки и искать конкретный объект.

В этом окне поиска также отображаются последние 5 выбранных объектов, и у меня возникла проблема с этим.

Чтобы иметь последние 5 выбранных объектов, я создал behaviourSubject, где я нажимаю объекты:

this.recentlyUsedObjects.push(_.find(this.objects, c => this.selectedObject === c.id.toString()));
      this.recentlyUsedObjects= this.recentlyUsedObjects.filter(c => c !== undefined);
      if (this.recentlyUsedObjects.length > 5) this.recentlyUsedObjects.shift();

так что this.recentlyUsedObjects - это мой поведенческий объект,

this.objects - это массив, в котором я храню список объектов, которые я получаю по подписке, в ngOnInit(),

this.selectedObject это строка, в которой я сохраняю текущий выбранный объект из окна поиска

if (this.recentlyUsedObjects.length > 5) this.recentlyUsedObjects.shift(); с помощью этой строки я делаю массив всегда из 5 элементов, так как хочу показать только последние 5 нажатых объектов,

this.recentlyUsedObjects= this.recentlyUsedObjects.filter(c => c !== undefined);

между тем эта строка была необходима, потому что у меня была проблема, когда приложение загружалось, список недавних объектов пуст, поэтому я получал сообщение об ошибке, когда он пытался отобразить значения из undefined object, что я и сделал с Решив это, как только один объект помещается в этот массив, я отфильтровываю исходный неопределенный объект, так как я видел, что с push() он просто добавляет новый объект, и у меня все еще есть position[0] undefined object.

поэтому последний шаг, в ngOnInit, мне нужно отфильтровать основной список объектов, используя мой массив recentlyUsedObjects, поэтому в приложении он показывает последние 5 объектов, НО он не повторяет эти объекты в ниже список, где ВСЕ объекты.

Таким образом, если объект попадает в список recentlyUsedObjects, его не нужно отображать в списке allObjects.

Моя проблема в том, что фильтрация работает, но что не работает, когда выбрано более 5 объектов, this.recentlyUsedObjects начнет выталкивать последний элемент, чтобы массив всегда оставался равным 5, что не происходит, когда объект выталкивается, он должен вернуться к отображению в списке allObjects, но этого не происходит!

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

this.objectService.getObjects().subscribe(obj=> {
      this.getRecentObjects().subscribe(recent=> {
        this.objects = obj;
        obj = obj.filter(o => {
          return !_.find(recent, r => {
            return r.id === o.id;
          });
        });

this.getRecentObjects() это поведенческий объект, о котором я говорил выше, в котором this.recentlyUsedObjects отправляется с next();

Есть идеи? Спасибо

1 Ответ

0 голосов
/ 28 августа 2018

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

изменение, которое я сделал, было:

this.objectService.getObjects().subscribe(obj=> {
      this.getRecentObjects().subscribe(recent=> {
        this.objects = obj;
        obj = obj.filter(o => {
          return !_.find(recent, r => {
            return r.id === o.id;
          });
        });

здесь> this.objects = obj;

Я изменил его на: this.objects = _.cloneDeep(obj);

и вместо этого: obj = obj.filter(o => { ...

Я делаю:

this.objects = this.objects.filter(o => { ...

не совсем уверен, почему это работает, а предыдущее - нет, но, по крайней мере, теперь это работает

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