【问题标题】:How to filter array and subarray items with identical filter如何使用相同的过滤器过滤数组和子数组项
【发布时间】:2021-05-17 18:02:01
【问题描述】:

我有下面的模型,当一个存在时,我需要按角色过滤主数组和项子数组。

this.model = [
        {label: 'Home', icon: 'pi pi-fw pi-home', routerLink: ['/main']},
        {label: 'Apps', icon:'pi pi pi-fw pi-desktop', routerLink: ['/main/admin'], role: 's_user',
            items: [
                {label: 'Steve', icon: 'pi pi-fw pi-desktop', url: ['ExtURLPlaceholder'], role: 's_user' },
                {label: 'Roger', icon: 'pi pi-fw pi-desktop', url: ['ExtURLPlaceholder'] },
            ]},
        {label: 'Admin', icon:'pi pi pi-fw pi-list', routerLink: ['/main/admin'], role: 'y_admin',
            items: [
                {label: 'Susbsystems', icon: 'pi pi-fw pi-id-card', routerLink: ['/main/admin/subsystems']},
                {label: 'Logs', icon: 'pi pi-fw pi-bookmark', routerLink: ['/uikit/floatlabel'], role: 's_user' },
            ]},
        ];

我可以像这样过滤顶级数组:

 this.model = this.model.filter((item)=>{
      if(item.role){
        const token = this.oauthService.getAccessToken();
        return this.jwtService.isAuthorized(token, [item.role])
      }
      return true
    })

我怎样才能以同样的方式过滤 items 子数组?

如果定义了角色,所需的结果将返回符合角色要求的所有项目和子项目,如果定义了角色,则过滤掉不符合角色要求的项目和子项目。

【问题讨论】:

  • 你不能过滤嵌套数组,因为你需要改变孩子或者只过滤父母。请添加想要的结果。

标签: javascript json angular typescript


【解决方案1】:

下面是一些演示解决方案的代码:

let model = [
  {label: 'Home', icon: 'pi pi-fw pi-home', routerLink: ['/main']},
  {label: 'Apps', icon:'pi pi pi-fw pi-desktop', routerLink: ['/main/admin'], role: 's_user',
      items: [
          {label: 'Steve', icon: 'pi pi-fw pi-desktop', url: ['ExtURLPlaceholder'], role: 's_user' },
          {label: 'Roger', icon: 'pi pi-fw pi-desktop', url: ['ExtURLPlaceholder'] },
      ]},
  {label: 'Admin', icon:'pi pi pi-fw pi-list', routerLink: ['/main/admin'], role: 'y_admin',
      items: [
          {label: 'Susbsystems', icon: 'pi pi-fw pi-id-card', routerLink: ['/main/admin/subsystems']},
          {label: 'Logs', icon: 'pi pi-fw pi-bookmark', routerLink: ['/uikit/floatlabel'], role: 's_user' },
      ]},
  ];

function filter(item) {
  if (['Apps', 'Steve'].includes(item.label) ) { // keep it?
    if (item.items) {
      item.items = item.items.filter(filter) // apply filter to subarray
    }
    console.log(item)
    return true
  }
  return false // else filter it out
}

model = model.filter(filter)

作为演示,这将只保留“Apps”,其子数组中只有“Steve”。

【讨论】:

  • 不是我需要的。我需要使用相同的过滤方案过滤所有模型节点及其子节点,但保留剩余节点的模型结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 2019-11-08
  • 2022-12-07
  • 2011-02-15
相关资源
最近更新 更多