【问题标题】:check arrays inside an array and filter based on a value in angular 2检查数组内的数组并根据角度 2 中的值进行过滤
【发布时间】:2017-08-29 17:24:28
【问题描述】:

这是用户数据的 JSON。

result = {
  "id": 5529,
  "roles": [
    {
      "id": 10,
      "name": "ADMIN",
      "privileges": [
        {
          "id": 100,
          "name": "ADD",
          "systemId": 3
        },
        {
          "id": 115,
          "name": "DEL",
          "systemId": 3
        }
      ]
    }
  ]
}

必须检查列表中是否存在给定的权限值并返回真或假。

尝试了一些代码,但没有按预期工作,下面给出了一个这样的代码尝试。 这里privilege = DEL,那么它应该返回true。

result.roles.forEach((element:any) => {
                   element.privileges.filter(function(item:any){
            if(item.name === privilege)
                return true;
            else 
                return false;
            });

如何有效地检查数组中的数组并根据值进行过滤并返回结果。

【问题讨论】:

  • 顺便说一句,if(item.name === privilege) return true; else return false; }); 你可以只写return item.name === privilege;
  • 它没有返回任何值。

标签: typescript


【解决方案1】:

虽然 forEach 函数对原始数组进行操作,但 Filter 函数不会。它将过滤后的数组作为输出。所以你可以过滤里面的数据,但它没有被分配给实际的数组。

试试这个,

result.roles.forEach((element) => {
    element.privileges = element.privileges.filter(function (item) {
        return item.name === privilege
    })
})

编辑 :- 我希望这是你正在寻找的从你开始的东西继续。

let val = result.roles.filter((element) => {
    return element.privileges.filter(function (item) {
        return item.name === privilege
    }).length != 0
}).length != 0

编辑 2 :- 但是更有效和更易于理解的解决方案是

function check() {
    for(role of result.roles){
        for(tmpprivilege of role.privileges){
            if(tmpprivilege.name === privilege){
                return true;
            }
        }
    }
    return false;
} 

let val = check()
console.log(val)

【讨论】:

  • 即使有匹配的数据也不返回任何结果。
  • 检查编辑,我已经尝试过了,但你的要求对我来说有点不清楚,你到底想要什么。请详细说明场景
  • 我需要从满足这个相等条件返回,要么将该值保存在变量中,要么从方法返回。
  • 所以整个函数,roles.forEach 应该根据这个数组的任何元素是否包含特权返回一个真假。
  • 是的,它没有返回尝试更新的答案,让 val : boolean = result.roles.forEach((element: any) => { return element.privileges.filter(function (item: any ) { return item.name === privilege }).length != 0 }) console.log("val "+val);
【解决方案2】:

result.roles.forEach((element:any) => {

使用somehttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

result.roles.some((element:any) => {
               return element.privileges.filter(function(item:any){
        if(item.name === privilege)
            return true;
        else 
            return false;
        }).length;

【讨论】:

  • 它没有返回任何值
【解决方案3】:

在角度你可以使用:

function filterTable(result:any){
let tmpArray: any=[]
for (let result of this. result.roles){
  for(let priv of result.privileges){
     if(priv.name==="DEL"){
       tmpArray.push(result)
   }     
}
return tmpArray;}

【讨论】:

  • 这个我们也可以在angular2中实现,但是如何返回值是我的问题
  • 现在你得到了 tmpArray 的结果,你可以返回它了。
猜你喜欢
  • 2015-10-17
  • 2021-12-06
  • 1970-01-01
  • 2021-04-01
  • 2021-08-19
  • 2021-12-25
  • 2019-03-13
  • 2022-06-13
  • 2016-07-01
相关资源
最近更新 更多