Javascript 使用多个键在多级json树中搜索
我有一个json树,其结构如下Javascript 使用多个键在多级json树中搜索,javascript,jquery,json,tree,Javascript,Jquery,Json,Tree,我有一个json树,其结构如下 { "treeId": "avhsgdkendkfhjsdoiendsj", "groupResponse": { "description": null, "id": "avhsgdkendkfhjsdoiendsj", "mAttr": null, "mAttrVal": null }, "childResponse": [ { "treeI
{
"treeId": "avhsgdkendkfhjsdoiendsj",
"groupResponse": {
"description": null,
"id": "avhsgdkendkfhjsdoiendsj",
"mAttr": null,
"mAttrVal": null
},
"childResponse": [
{
"treeId": "6p263uh38xvnchmsrw2jn48ut",
"childResponse": [],
"groupResponse": {
"description":null,
"id ":"6p263uh38xvnchmsrw2jn48ut",
"mAttr": "xxx",
"mAttrVal": "222"
}
},
{
"treeId": "2fywxwi93lg7fqggdqqpqxvpg",
"childResponse": [],
"groupResponse": {
"description ":null,
"id": "2fywxwi93lg7fqggdqqpqxvpg",
"mAttr": "xxx",
"mAttrVal": "111"
}
}
]
}
我想基于单个/多个键搜索节点,例如{“mAttr”:“xxx”、“mAttrVal”、“222”}
我找到了一个解决方案
它可以基于任何单个键进行搜索。如何修改它以使用多个键?我的树的深度没有限制。我没有测试它,但我认为它应该可以工作
Object.prototype.findKey = function(keyObj) {
var p,key,tRet=[],add=true;
for (p in this) {
if (this[p] instanceof Object) {
if (this.hasOwnProperty(p)) {
tRet.concat(this[p].findKey(keyObj));
}
}
}
for(key in keyObj){
if(!this.hasOwnProperty(key)||!this[key]===keyObj[key])
add=false;
}
if(add)
tRet.push(this);
return tRet;
};
如果我错了,告诉我;) 以下内容可能会有所帮助
var data = {
'treeId': 'avhsgdkendkfhjsdoiendsj',
'groupResponse': {
'description': null,
'id': 'avhsgdkendkfhjsdoiendsj',
'mAttr': null,
'mAttrVal': null
},
'childResponse': [
{
'treeId': '6p263uh38xvnchmsrw2jn48ut',
'childResponse': [
],
'groupResponse': {
'description': null,
'id ': '6p263uh38xvnchmsrw2jn48ut',
'mAttr': 'xxx',
'mAttrVal': '222'
}
},
{
'treeId': '2fywxwi93lg7fqggdqqpqxvpg',
'childResponse': [
],
'groupResponse': {
'description ': null,
'id': '2fywxwi93lg7fqggdqqpqxvpg',
'mAttr': 'xxx',
'mAttrVal': '111'
}
}
]
};
var search = function(data, qObj){
var i, k, matched = true, set = [];
for (k in qObj) {
if(!qObj.hasOwnProperty(k))
continue;
if(!data.groupResponse.hasOwnProperty(k) || data.groupResponse[k] != qObj[k]){
matched = false;
break;
}
}
if(matched){
set.push(data.groupResponse);
}
for(i = 0; i < data.childResponse.length; i++){
s = search(data.childResponse[i], qObj);
Array.prototype.push.apply(set, s);
}
return set;
}
console.log(search(data, { "mAttr": "xxx", "mAttrVal": "222"}));
希望这有帮助您只想要第一个对象或每个对象都有这些键/值?@JuniusRendel我想要所有这样的节点它适用于以上键。但是,当我执行
search(data,{“id”:“6p263uh38xvnchmsrw2jn48ut”})时,
它不返回任何节点,搜索search(data,{“id”:“2fywxwi93lg7fqggdqqpqxvpg”}
时,返回的却是正确的。第一个childResponse具有属性名id
,而不是id
。请注意,还有一个空格
。差点把我的头发拔了:)哈哈,抓得好。谢谢你的帮助
var data = {
'treeId': 'avhsgdkendkfhjsdoiendsj',
'groupResponse': {
'description': null,
'id': 'avhsgdkendkfhjsdoiendsj',
'mAttr': null,
'mAttrVal': null
},
'childResponse': [
{
'treeId': '6p263uh38xvnchmsrw2jn48ut',
'childResponse': [
],
'groupResponse': {
'description': null,
'id ': '6p263uh38xvnchmsrw2jn48ut',
'mAttr': 'xxx',
'mAttrVal': '222'
}
},
{
'treeId': '2fywxwi93lg7fqggdqqpqxvpg',
'childResponse': [
],
'groupResponse': {
'description ': null,
'id': '2fywxwi93lg7fqggdqqpqxvpg',
'mAttr': 'xxx',
'mAttrVal': '111'
}
}
]
};
var search = function(data, qObj){
var i, k, matched = true, set = [];
for (k in qObj) {
if(!qObj.hasOwnProperty(k))
continue;
if(!data.groupResponse.hasOwnProperty(k) || data.groupResponse[k] != qObj[k]){
matched = false;
break;
}
}
if(matched){
set.push(data.groupResponse);
}
for(i = 0; i < data.childResponse.length; i++){
s = search(data.childResponse[i], qObj);
Array.prototype.push.apply(set, s);
}
return set;
}
console.log(search(data, { "mAttr": "xxx", "mAttrVal": "222"}));
[{"description":null,"id ":"6p263uh38xvnchmsrw2jn48ut","mAttr":"xxx","mAttrVal":"222"}]