Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用多个键在多级json树中搜索_Javascript_Jquery_Json_Tree - Fatal编程技术网

Javascript 使用多个键在多级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

我有一个json树,其结构如下

{
    "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"}]