简体   繁体   English

如何使用Javascript或JQuery搜索巨大的JSON

[英]How to search huge JSON by using Javascript or JQuery

In my application, web service returns a large dataset of JSON file. 在我的应用程序中,Web服务返回了一个很大的JSON文件数据集。 This is the part of my JSON string. 这是我的JSON字符串的一部分。

[
       {
          "Value":"21",
          "Province":"Default",
          "Branches":[
             {
                "Value":"1108",
                "Province":"Davie",
                "IsValid":"False"
             },
             {
                "Value":"1107",
                "Province":"Ab area109",
                "IsValid":"False"
             },
             {
                "Value":"1105",
                "Province":"Hollywood",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"17",
          "Province":"East",
          "Branches":[
             {
                "Value":"212",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"219",
                "Province":"area116",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"24",
          "Province":"East11",
          "Branches":[
             {
                "Value":"211",
                "Province":"area108",
                "IsValid":"False"
             },
             {
                "Value":"218",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"1102",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"25",
          "Province":"hilton25",
          "Branches":[
             {
                "Value":"213",
                "Province":"area110",
                "IsValid":"False"
             },
             {
                "Value":"220",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       }
]

I need to search province name and get all the nodes that match up until its parent. 我需要搜索省名并获取所有匹配的节点,直到其父节点为止。 Which means I need to search provine name by Root level and Branche level. 这意味着我需要按“根”级别和“分支”级别搜索provine名称。

as the eg 1. when the search key = Default , Following JSON sholud be return. 例如1.当搜索key = Default ,将返回以下JSON。

[
       {
          "Value":"21",
          "Province":"Default",
          "Branches":[
             {
                "Value":"1108",
                "Province":"Davie",
                "IsValid":"False"
             },
             {
                "Value":"1107",
                "Province":"Ab area109",
                "IsValid":"False"
             },
             {
                "Value":"1105",
                "Province":"Hollywood",
                "IsValid":"False"
             }
          ]
       }
]

eg 2. when the search key = area110 , Following JSON sholud be return. 例如2.当搜索key = area110 ,将返回以下JSON。

[
    {
      "Value":"25",
      "Province":"hilton25",
      "Branches":[
         {
            "Value":"213",
            "Province":"area110",
            "IsValid":"False"
         }
      ]
    }
]

How can I do this by using Javascript or JQuery. 如何使用Javascript或JQuery执行此操作。 Please help me. 请帮我。

In JavaScript, you can call JSON.parse() to parse that input into an array of JavaScript Objects. 在JavaScript中,您可以调用JSON.parse()将该输入解析为JavaScript对象数组。 From there, it's pretty simple with a couple for-of loops. 从那里开始,通过几个for-of循环就很简单了。

function searchProvince(prov) {
  var result = [];
  var json; // JSON string (or you can pass it in as a function parameter)
  /*
   * if you don't already have the JSON string, get it here
   */
  var objects = JSON.parse(json); // parse JSON string as JavaScript Object array
  for (obj of objects) {
    // if the base Province matches, take the whole object
    if (obj.Province === prov) {
      result.push(obj);
    } else {
      // otherwise, only take the branches that have a matching Province
      var toAdd = {Value: obj.Value, Province: obj.Province, Branches: []};
      for (branch of obj.Branches) {
        if (branch.Province === prov) {
          toAdd.Branches.push(branch);
        }
      }
      // only add the copy if any branches were matched
      if (toAdd.Branches.length) {
        result.add(toAdd);
      }
    }
  }
  return JSON.stringify(result); // returns the result as a JSON string
  // can also return result if you want the array of JavaScript Objects
}

It's been a while since I've developed in JS, so if this could be cleaner, let me know! 自从我用JS开发以来已经有一段时间了,所以如果这可以变得更干净,请告诉我!

One possible solution is to use Array.filter() to keep only the objects that satisfies one of the next conditions: 一种可能的解决方案是使用Array.filter()仅保留满足以下条件之一的objects

  • A) The Province property of the object match the related searched key . A) objectProvince属性匹配相关的搜索key
  • B) Some object inside the Branches array has a match on the searched key . B) Branches数组中的某些object在搜索到的key上具有匹配key

If the condition B) is satisfied, we also use filter() to keep only the matching objects inside Branches array. 如果满足条件B) ,我们还使用filter()将匹配的objects仅保留在Branches数组中。

 let input=[{"Value":"21","Province":"Default","Branches":[{"Value":"1108","Province":"Davie","IsValid":"False"},{"Value":"1107","Province":"Ab area109","IsValid":"False"},{"Value":"1105","Province":"Hollywood","IsValid":"False"}]},{"Value":"17","Province":"East","Branches":[{"Value":"212","Province":"area109","IsValid":"False"},{"Value":"219","Province":"area116","IsValid":"False"}]},{"Value":"24","Province":"East11","Branches":[{"Value":"211","Province":"area108","IsValid":"False"},{"Value":"218","Province":"area109","IsValid":"False"},{"Value":"1102","Province":"area999","IsValid":"False"}]},{"Value":"25","Province":"N25","Branches":[{"Value":"213","Province":"area110","IsValid":"False"},{"Value":"220","Province":"area999","IsValid":"False"}]}] const filterByProvinceKey = (arr, key) => { return arr.filter(parent => { let someChildMatch = parent.Branches.some( child => child.Province === key ); if (parent.Province === key) { return true; } else if (someChildMatch) { parent.Branches = parent.Branches.filter(c => c.Province === key); return true; } return false; }); } console.log("Key = 'Default':", filterByProvinceKey(input, "Default")); console.log("Key = 'area110':", filterByProvinceKey(input, "area110")); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

In the case your input is a JSON (string), then you will need to use JSON.parse() first 如果您的输入是JSON (字符串),则需要首先使用JSON.parse()

let input = JSON.parse(<some_json>);

If, instead, you don't need a strict match on the key and you wanted to keep register where a section of the Province name matched the search key , then you can use String.match() for this: 相反,如果您不需要严格的key匹配,并且想要在Province名中与搜索key匹配的部分进行注册,则可以使用String.match()

 let input=[{"Value":"21","Province":"Default","Branches":[{"Value":"1108","Province":"Davie","IsValid":"False"},{"Value":"1107","Province":"Ab area109","IsValid":"False"},{"Value":"1105","Province":"Hollywood","IsValid":"False"}]},{"Value":"17","Province":"East","Branches":[{"Value":"212","Province":"area109","IsValid":"False"},{"Value":"219","Province":"area116","IsValid":"False"}]},{"Value":"24","Province":"East11","Branches":[{"Value":"211","Province":"area108","IsValid":"False"},{"Value":"218","Province":"area109","IsValid":"False"},{"Value":"1102","Province":"area999","IsValid":"False"}]},{"Value":"25","Province":"N25","Branches":[{"Value":"213","Province":"area110","IsValid":"False"},{"Value":"220","Province":"area999","IsValid":"False"}]}] const filterByProvinceKey = (arr, key) => { let reKey = new RegExp(key, "i"); return arr.filter(parent => { let someChildMatch = parent.Branches.some( child => child.Province.match(reKey) ); if (parent.Province.match(reKey)) { return true; } else if (someChildMatch) { parent.Branches = parent.Branches.filter(c => c.Province.match(reKey)); return true; } return false; }); } console.log("Key = 'AreA':", filterByProvinceKey(input, "area")); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

Try this,hope it helps. 试试这个,希望对您有所帮助。

 let inp = [ { "Value":"21", "Province":"Default", "Branches":[ { "Value":"1108", "Province":"Davie", "IsValid":"False" }, { "Value":"1107", "Province":"Ab area109", "IsValid":"False" }, { "Value":"1105", "Province":"Hollywood", "IsValid":"False" } ] }, { "Value":"17", "Province":"East", "Branches":[ { "Value":"212", "Province":"area109", "IsValid":"False" }, { "Value":"219", "Province":"area116", "IsValid":"False" } ] }, { "Value":"24", "Province":"East11", "Branches":[ { "Value":"211", "Province":"area108", "IsValid":"False" }, { "Value":"218", "Province":"area109", "IsValid":"False" }, { "Value":"1102", "Province":"area999", "IsValid":"False" } ] }, { "Value":"25", "Province":"hilton25", "Branches":[ { "Value":"213", "Province":"area110", "IsValid":"False" }, { "Value":"220", "Province":"area999", "IsValid":"False" } ] } ]; var key = prompt("Please enter the key"); // Your search key var result =[] for(d in inp){ if(inp[d]['Province']==key) result.push(inp[d]) for(d1 in inp[d]['Branches']) if(inp[d]['Branches'][d1]['Province']==key) result.push(inp[d]) } console.log(result) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM