如何在嵌套数组中过滤JSON对象数组

问题描述 投票:1回答:2

我有一个对象数组,我正在对它的属性名称“用户名”进行过滤。

array =   [{
    "id": 1,
    "username": "admin",
    "roles": [{
            "name": "Administrator"
        },
        {
            "name": "agent"
        }
    ]
},
{
    "id": 2,
    "username": "admin2",
    "roles": [{
            "name": "Administrator2"
        },
        {
            "name": "agent2"
        }
    ]
},
{
    "id": 3,
    "username": "admin3",
    "roles": [{
            "name": "Administrator3"
        },
        {
            "name": "agent3"
        }
      ]
    }
  ]

过滤功能是这样的

  transform(array: any, valueToSearch: string): any[] {

      return array.filter(e => 
       e.username.toLowerCase().indexOf(valueToSearch.toLowerCase()) 
       !== -1);

     }

一切正常,但现在我想过滤对象中“roles”数组中的属性名称“name”。例如,我想返回一个对象,其“roles”数组包含“name”= agent3,因此它应返回位于我示例中最后一个对象的整个对象。我尝试过

return agents.filter(e => e.roles.filter(ee => 
       ee.valueToSearch.toLowerCase()) !== -1));

但它不起作用。

这是dmeo https://stackblitz.com/edit/angular-txchxs?embed=1&file=src/app/agentFilter.pipe.ts

arrays json angular typescript
2个回答
1
投票

根据您在问题中给出的示例,我能够像这样更改您现有的功能,我希望这是您的要求..

  ngOnInit() {
    this.transform(this.array,'agent3');
  }

  transform(array: any, valueToSearch: string): any[] {
    return  this.array.filter(e => {
        e.roles.filter(ee => {
          if(ee.name.toLowerCase() === valueToSearch.toLowerCase() ) {
            console.log(e);
            this.finalResult = e;
          }
        })
      })
  }

工作Stackblitz:https://stackblitz.com/edit/angular-uzgni7


0
投票

myarray =   [{
    "id": 1,
    "username": "admin",
    "roles": [{
            "name": "Administrator"
        },
        {
            "name": "agent"
        }
    ]
},
{
    "id": 2,
    "username": "admin2",
    "roles": [{
            "name": "Administrator2"
        },
        {
            "name": "agent2"
        }
    ]
},
{
    "id": 3,
    "username": "admin3",
    "roles": [{
            "name": "Administrator3"
        },
        {
            "name": "agent3"
        }
      ]
    }
  ];
  

function myFunction(){
    var filtered= myarray.filter((obj)=>{
        return obj.username.match(new RegExp(document.getElementById('search').value,'ig'));
    });
    console.log(filtered);
};
<input type="text" id="search" onkeyup="myFunction()"/>
© www.soinside.com 2019 - 2024. All rights reserved.