角度-如何动态比较2个数组以过滤出对象?

时间:2018-08-28 06:44:01

标签: angular filter observable

我有一个使用

从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一起发送;

有什么想法吗?谢谢

1 个答案:

答案 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 => { ...

不是很确定为什么这行得通,以前的那个行不通,但至少现在行得通