在我的应用程序中,Web服务返回了JSON文件的大型数据集。这是我的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"
}
]
}
]
我需要搜索省名并获得所有匹配的节点,直到其父节点为止。这意味着我需要按“根”级别和“分支”级别搜索provine名称。
为
例如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"
}
]
}
]
例如2。。当返回key = area110
之后,将返回遵循JSON的搜索。
[
{
"Value":"25",
"Province":"hilton25",
"Branches":[
{
"Value":"213",
"Province":"area110",
"IsValid":"False"
}
]
}
]
如何使用Javascript或JQuery执行此操作。请帮助我。
答案 0 :(得分:1)
在JavaScript中,您可以调用JSON.parse()
将该输入解析为JavaScript对象数组。从那里开始,通过几个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
}
自从我用JS开发以来已经有一段时间了,所以如果这可以更清洁,请告诉我!
答案 1 :(得分:1)
一种可能的解决方案是使用Array.filter()仅保留满足以下条件之一的objects
:
Province
的{{1}}属性与搜索到的相关object
相匹配。key
数组中的某些object
与搜索到的Branches
匹配。 如果满足条件 B),我们还使用key
将匹配的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;}
(字符串),那么您将需要先使用JSON.parse()
JSON
如果您不需要对let input = JSON.parse(<some_json>);
进行严格匹配,而您想保留key
名称的一部分与搜索Province
匹配的位置,那么您可以为此使用String.match():
key
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"));
答案 2 :(得分:1)
尝试一下,希望对您有所帮助。
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)