如何在复杂的JSON中知道特定值是否可用

时间:2016-04-05 09:29:58

标签: javascript json angular rxjs

我有像这样的json

 myPermission=[  
   {  
      "root_permission_name":"HR",
      "root_pk":3,
      "child_list":[  
         {  
            "child_pk":8,
            "child_permission_name":"Employee Management",
            "sub_child_list":[  

            ]
         }
      ]
   },
   {  
      "root_permission_name":"Finance",
      "root_pk":8,
      "child_list":[  
         {  
            "child_pk":20,
            "child_permission_name":"Fees",
            "sub_child_list":[  
               {  
                  "sub_child_permission_name":"Create Fees",
                  "sub_child_pk":5
               },
               {  
                  "sub_child_permission_name":"Schedule Fee Collection Dates ",
                  "sub_child_pk":6
               }                  
            ]
         },
         {  
            "child_pk":21,
            "child_permission_name":"Category",
            "sub_child_list":[  

            ]
         },             
         {  
            "child_pk":26,
            "child_permission_name":"Finance Reports",
            "sub_child_list":[  
               {  
                  "sub_child_permission_name":"Report",
                  "sub_child_pk":17
               },
               {  
                  "sub_child_permission_name":"Compare Transection",
                  "sub_child_pk":18
               },
               {  
                  "sub_child_permission_name":"Fee Receipts",
                  "sub_child_pk":19
               }
            ]
         }
      ]
   }
]

有没有办法可以在不使用FOR循环的情况下知道我的json中是否有特定值(例如"费用")?

如果有人通过RXJS解决这个问题,那将会很明显。

注意:我不必使用for循环

3 个答案:

答案 0 :(得分:0)

  

有没有办法可以在不使用FOR循环的情况下知道我的json中是否有特定值(例如“费用”)?

我假设你的意思是for循环或任何其他循环结构。如果是这样,那么答案就是“不,没有,也不合理。”

因此,您使用循环结构。具体来说,嵌套循环结构,因为Fees位于子列表中:

var hasFees = myPermission.some(function(entry) {
    return entry.child_list.some(function(child) {
        return child.child_permission_name == "Fees";
    });
});

Array#some为数组中的每个条目调用一次回调,第一次回调返回truthy值时停止。如果回调曾返回真值,则返回值为true,否则返回false。所以对于像这样的搜索来说很方便。

直播示例:

var myPermission = [{
    "root_permission_name": "HR",
    "root_pk": 3,
    "child_list": [{
        "child_pk": 8,
        "child_permission_name": "Employee Management",
        "sub_child_list": [

        ]
    }]
}, {
    "root_permission_name": "Finance",
    "root_pk": 8,
    "child_list": [{
        "child_pk": 20,
        "child_permission_name": "Fees",
        "sub_child_list": [{
            "sub_child_permission_name": "Create Fees",
            "sub_child_pk": 5
        }, {
            "sub_child_permission_name": "Schedule Fee Collection Dates ",
            "sub_child_pk": 6
        }]
    }, {
        "child_pk": 21,
        "child_permission_name": "Category",
        "sub_child_list": [

        ]
    }, {
        "child_pk": 26,
        "child_permission_name": "Finance Reports",
        "sub_child_list": [{
            "sub_child_permission_name": "Report",
            "sub_child_pk": 17
        }, {
            "sub_child_permission_name": "Compare Transection",
            "sub_child_pk": 18
        }, {
            "sub_child_permission_name": "Fee Receipts",
            "sub_child_pk": 19
        }]
    }]
}];
var hasFees = myPermission.some(function(entry) {
    return entry.child_list.some(function(child) {
        return child.child_permission_name == "Fees";
    });
});
document.body.innerHTML = hasFees;

答案 1 :(得分:0)

这个怎么样:

var presence = JSON.stringify(yourJSON).indexOf('"Fees"') > -1; 

或者这个:

var presence = JSON.stringify(yourJSON).indexOf(':"Fees"') > -1;

我只是将您的object字符串化,然后检查是否存在"Fees"。如果它是-1那么它就不存在,否则就是。

答案 2 :(得分:0)

你要求的有点不清楚。根据这个问题,我的猜测是,这是一个教师希望学生以功能性方法而不是命令式方法执行此任务的任务。因此,“no for loop”标准。

以下函数将在json中递归遍历所有值并查找特定值。如果该值存在(无论属性名称),它将返回true。

它使用Array.some,它将“测试数组中的某些元素是否通过了由提供的函数实现的测试。”

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter{

  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http.csrf().disable();
      http.httpBasic();
      http.
             authorizeRequests()
             .antMatchers("/hello").permitAll()
             .anyRequest().authenticated();
  }
  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
      System.out.println("user added in mem!");
      auth
          .inMemoryAuthentication()
              .withUser("xqf").password("123").roles("ADMIN");
  }
}

可以轻松扩展为仅查找某些属性的值。作为RxJS also has the some method,在该上下文中使用它不应该是任何问题。