[英]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
:
Province
property of the object
match the related searched key
. A) object
的Province
属性匹配相关的搜索key
。 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.