【问题标题】:How to know a particular value is available or not in a complex JSON如何知道特定值在复杂 JSON 中是否可用
【发布时间】:2016-04-05 09:29:58
【问题描述】:

我有一个这样的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
               }
            ]
         }
      ]
   }
]

有没有一种方法可以让我知道特定值(例如“费用”)在我的 json 中是否可用而不使用 FOR 循环?

如果有人通过 RXJS 解决这个问题,那将是非常可观的。

注意:我不必使用 for 循环

【问题讨论】:

  • Rxjs 用于异步事件。这是一个静态集合。即使有一种使用 Rxjs 的方法,这也没有多大意义。
  • 结果应该是什么样子?
  • 你是如何得到这份清单的?来自 HTTP 请求?
  • JSON 是一种用于数据交换的文本符号。如果您正在处理 JavaScript 源代码,而不是处理 string,那么您就不是在处理 JSON。
  • JSON 是动态的。它是通过 http 请求来的。

标签: javascript json angular rxjs


【解决方案1】:

这个怎么样:

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

或者这个:

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

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

【讨论】:

  • 感谢无效!现在我得到了我正在寻找的答案。
  • 我没有投反对票,但我认为这两个问题都具有误导性。这会显示 JSON 是否包含键,但不会创建与过滤器匹配的元素列表。这就是我对过滤器的期望。
  • 我想这个问题已经很清楚了Is there a way that i can know whether the particular value (e.g. "Fees") is available or not in my json without using FOR loop ?
  • 这就是我赞成你的答案的原因(阅读到最后;-))但问题标题具有误导性。
  • @GünterZöchbauer 绝对标题具有误导性。 OP,你能想出更好的办法吗?
【解决方案2】:

有没有一种方法可以让我知道特定值(例如“费用”)在我的 json 中是否可用而不使用 FOR 循环?

我假设您的意思是 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;

【讨论】:

    【解决方案3】:

    有点不清楚你要求什么。基于这个问题,我的猜测是,这是一项教师希望学生以功能性方法而不是命令性方法执行此任务的作业。因此,“无 for 循环”标准。

    以下函数将递归遍历 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 also has the some method,在这种情况下使用应该没有任何问题。

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 2019-11-21
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 2021-09-19
      • 2018-12-23
      相关资源
      最近更新 更多