У меня есть массив объектов, которые я получаю из 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()
;
Есть идеи? Спасибо