使用多个键在多层JSON树中搜索

问题描述:

我有一个具有以下结构的json树

I have a json tree with following structure

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

I want to search for a node based on single/multiple key(s) e.g. { "mAttr": "xxx", "mAttrVal","222"}

我在此答案中找到了解决方案

I found a solution mentioned in this answer

Object.prototype.findKey = function(keyObj) {
    var p, key, val, tRet;
    for (p in keyObj) {
        if (keyObj.hasOwnProperty(p)) {
            key = p;
            val = keyObj[p];
        }
    }

    for (p in this) {
        if (p == key) {
            if (this[p] == val) {
                return this;
            }
        } else if (this[p] instanceof Object) {
            if (this.hasOwnProperty(p)) {
                tRet = this[p].findKey(keyObj);
                if (tRet) { return tRet; }
            }
        }
    }

    return false;
};

它可以基于任何单个键进行搜索.如何修改它以与多个键一起使用?我的树的深度没有限制.

It can search based on any single key. How to modify it to work with multiple keys? There is no limit to the depth of my tree.

以下内容可能会有所帮助,

The following might help,

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

希望这会有所帮助