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

How to know a particular value is available or not in a complex JSON

本文关键字:复杂 JSON 是否 何知道 一个      更新时间:2024-01-23

我有一个类似的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中的特定值(例如"Fees")是否可用?

如果有人通过RXJS解决这个问题,那将是值得注意的。

注意:我不必使用循环

这个怎么样:

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

或者这个:

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

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

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

我假设你指的是for循环或任何其他循环构造。如果是这样,答案是"不,没有,无论如何都不合理。"

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

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

Array#some为数组中的每个条目调用一次回调,在回调第一次返回真实值时停止。如果回调返回了真值,则返回值为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;

您的要求有点不清楚。基于这个问题,我的猜测是,这是一项老师希望学生以功能性的方法而不是命令性的方法来完成的作业。因此提出了"不适用于循环"的标准。

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

它使用Array.some,它将"测试数组中的某个元素是否通过所提供函数实现的测试"

var hasPerm = myPermission
   .some(function (arr) {
      return hasPermission(arr, 'Fees') 
   });
console.log(hasPerm); // true/false
function hasPermission(arr, needle) {
   return Object
      .keys(arr)
      .some(function(key) {
         if (typeof arr[key] === 'object') {
            return hasPermission(arr[key], needle);
         } else {
            return arr[key] === needle;
         }
      })
}

它可以很容易地扩展为只查找某些属性的值。由于RxJS也有some方法,因此在该上下文中使用应该不会有任何问题。