【问题标题】:How to search JSON string using JQuery如何使用 JQuery 搜索 JSON 字符串
【发布时间】:2019-04-29 18:21:18
【问题描述】:

在我使用 Web 服务的应用程序中,该 Web 服务方法返回 JSON 字符串,如下所示,

[
   {
      "No":"21",
      "Area":"Default",
      "Branches":[
         {
            "No":"1108",
            "Area":"Davie",
            "IsValid":"False"
         },
         {
            "No":"1107",
            "Area":"Ab region109",
            "IsValid":"False"
         },
         {
            "No":"1105",
            "Area":"Hollywood",
            "IsValid":"False"
         }
      ]
   },
   {
      "No":"17",
      "Area":"East",
      "Branches":[
         {
            "No":"212",
            "Area":"region109",
            "IsValid":"False"
         },
         {
            "No":"219",
            "Area":"region116",
            "IsValid":"False"
         }
      ]
   },
   {
      "No":"24",
      "Area":"East11",
      "Branches":[
         {
            "No":"211",
            "Area":"region108",
            "IsValid":"False"
         },
         {
            "No":"218",
            "Area":"region109",
            "IsValid":"False"
         },
         {
            "No":"1102",
            "Area":"region999",
            "IsValid":"False"
         }
      ]
   },
   {
      "No":"25",
      "Area":"N25",
      "Branches":[
         {
            "No":"213",
            "Area":"region110",
            "IsValid":"False"
         },
         {
            "No":"220",
            "Area":"region999",
            "IsValid":"False"
         }
      ]
   }
]

我将此 JSON 与 kendo treeview 一起使用。这适用于 PC 设备。但是随着巨大的 JSON 集(JSON 之上是巨大集的一部分)kendo treeview 得到标签和移动设备的滞后问题。目前这个JSON,我直接绑定kendo treeview。但为了减少滞后问题并提高效率,我需要在过滤后将 JSON 字符串绑定到kendo treeview。那么我就不需要绑定所有这些巨大的JSON,只绑定相关的JSON。我认为要实现这一点,我需要创建另一个函数来搜索/过滤这个巨大的 JSON 结果。例如,当search key = Hollywood 我需要返回以下 JSON(仅相关分支详细信息并删除其他部分 "No":"1108" 和 "No":"1107")

[
   {
      "No":"21",
      "Area":"Default",
      "Branches":[
         {
            "No":"1105",
            "Area":"Hollywood",
            "IsValid":"False"
         }
      ]
   }
]

eg: 2 当search key = East,我需要返回以下JSON结果。这意味着我需要在根级别和分支级别搜索区域值

[
   {
      "No":"17",
      "Area":"East",
      "Branches":[
         {
            "No":"212",
            "Area":"region109",
            "IsValid":"False"
         },
         {
            "No":"219",
            "Area":"region116",
            "IsValid":"False"
         }
      ]
   }
]

如何使用JQuery 函数或其他正确方法来做到这一点。

【问题讨论】:

    标签: javascript jquery kendo-ui treeview kendo-treeview


    【解决方案1】:

    这应该可以完成工作

    function FilterTree(arr, searchField, searchValue, subSearchField,  results, parentArr){
        for (var i=0 ; i < arr.length ; i++) {
            if (arr[i][searchField] == searchValue) {
                if(parentArr === undefined) results.push(arr[i]);
                else parentArr[subSearchField].push(arr[i]);
    
            }else if(arr[i][subSearchField] !== undefined){
                var par = JSON.parse(JSON.stringify(arr[i]))
                    par[subSearchField] = []
    
                FilterTree(arr[i][subSearchField], searchField, searchValue, subSearchField,  results, par)
            }
        }       
    
        if(parentArr !== undefined && parentArr[subSearchField].length) results.push(parentArr)
        return results
        }
    

    这将 A) 循环遍历顶层。如果找到匹配项,它将被添加到结果树中

    B) 如果顶层具有指定的子级,则将再次调用该函数,将子级作为顶层并将父级 (OP) 添加到另一个数组。然后,如果在子节点中找到匹配项,则会在将 OP 添加到循环结束时的结果树之前将其添加到 OP

    调用示例:

    FilterTree(tree, "Area", "Hollywood", "Branches", [])
    

    “tree”是您的原始 JSON 对象

    【讨论】:

    • 您好,先生,我以FilterTree(tree, "Area", "Hollywood", "Branches", []) 运行您的代码。我将 JSON 对象作为参数传递。但它返回[]空输出
    • 我不确定是什么问题。这是对我有用的小提琴jsfiddle.net/ytqmr8jd/7
    • 谢谢先生,我会检查一下如何避免搜索键区分大小写,这意味着当searchkey = Default JSON正确返回时,但是当searchkey = default时没有返回值,因为有d 很简单。有任何解决方案来避免这种区分大小写
    • 传入小写变量并在if语句的字段变量末尾添加“.toLowerCase()”。arr[i][...Field].toLowerCase()
    【解决方案2】:

    我建议准备一个剑道数据源。 1) 使用transport将数据读入你的数据源

    2) 剑道数据源支持filter operation

    3) 将数据源绑定到树形视图

    <div id="treeview"></div>
    <script>
    var dataSource = new kendo.data.DataSource({
      transport: {
        read: {
          url: "https://demos.telerik.com/kendo-ui/service/products",
          dataType: "jsonp" // "jsonp" is required for cross-domain requests; use "json" for same-domain requests
        }
      },
      filter: { field: "ProductName", operator: "startswith", value: "Cha" }
    });
    
      dataSource.fetch(function(){
      var view = dataSource.view();
       $("#treeview").kendoTreeView({
      dataSource: view,
      dataTextField: "ProductName"
    });
    });
    

    【讨论】:

    • 我正在使用剑道,但问题在于庞大的数据集剑道在移动和标签设备上遇到了滞后问题。因此我需要避免这个问题所以尝试移动这个方法
    • 您是否建议移动和标签设备滞后问题的选项?
    • 我是一名网络开发人员,所以我不知道这是否能解决您在移动设备和标签设备上的问题。我只是提出了一个解决方案,说明如何在树形视图中轻松显示过滤后的数据。
    • 好的,谢谢你的建议。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2019-09-17
    • 2011-06-03
    • 2020-03-29
    • 2022-01-23
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多