根据属性值过滤 JSON 对象列表,属性值在另一个 JSON 对象列表中

时间:2021-07-21 22:34:09

标签: angular typescript

我尝试了以下代码:

var Mylist={[text:"rate"], 
     [text:"domain"]};

     var newlist= 
     {[displayname:"rate"], 
     [displayname:"forms"], 
     [displayname:"domain"]};
     
     Mylist.forEach(element=> {
     newlist =newlist.filter(p => 
     p.displayname===element.text);
});
```
Whatever is contained in `mylist` should be filtered in `newlist`.

Note: both list are dynamic and keeps changing its property value.

2 个答案:

答案 0 :(得分:0)

这是一个简化的示例,它使用您指定的两个数组,并使用一个 Observable 作为通知机制。每当修改任一数组时,Observable 都会发出更改通知并重新过滤列表。

基本代码是这样的:

  mylist = [{ text: 'rate' }, { text: 'domain' }];
  newlist = [
             { displayname: 'rate' },
             { displayname: 'forms' },
             { displayname: 'domain' }
            ];

  // Define an Observable to post notifications
  private changeSubject = new BehaviorSubject<boolean>(true);
  change$ = this.changeSubject.asObservable();

  filteredList$ = this.change$.pipe(
    map(() =>
      this.newlist.filter(item =>
        this.mylist.some(key => key.text === item.displayname)
      )
    )
  );

  addKey(key: string) {
    this.mylist.push({ text: key });
    // Change notification
    this.changeSubject.next(true);
  }

  addDisplay(name: string) {
    this.newlist.push({ displayname: name });
    // Change notification
    this.changeSubject.next(true);
  }

然后 UI 绑定到 filteredList$ observable,因此只要过滤的数据发生变化,它就会自动更新。

可以在此处找到工作示例应用程序:https://stackblitz.com/edit/angular-filter-lists-as-data-changes-deborahk

如果这不是您所需要的,请随意 fork stackblitz 并根据需要进行更新。

答案 1 :(得分:0)

let yFilter=this.mylist.map(itemy=>{ return itemy.text; });

this.newlist=this.newlist.filter(itemx=>yFilter.includes(item.Displayname));