我有一个使用
从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()
它只是追加了新对象,而我仍然在{{1}中} position[0]
。
所以最后一步,在undefined object
中,我需要使用我的ngOnInit
数组过滤掉主要对象列表,因此在App中它显示了最后5个对象,但不再重复下列列表中的所有对象。
因此,如果对象进入recentlyUsedObjects
列表,则不需要显示在recentlyUsedObjects
列表中。
我的问题是,筛选出有效,但不起作用的是,当选择了5个以上的对象时,allObjects
将开始推出最后一个元素,以使数组始终保持在5,不会发生的事情是,一旦将对象推出,它应该返回并显示在this.recentlyUsedObjects
列表中,但这不会发生!
如何更改过滤功能以继续检查某个对象是否不在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;
});
});
这是我上面所说的BehaviourSubject,其中this.getRecentObjects()
与this.recentlyUsedObjects
一起发送;
有什么想法吗?谢谢
答案 0 :(得分:0)
因此,在经过一些尝试之后,代码显然是正确的,使用该过滤器,我应该将对象从最近的5object数组中推出之后,返回到原始数组。
我所做的更改是:
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 => { ...
不是很确定为什么这行得通,以前的那个行不通,但至少现在行得通