使用多个键在多层JSON树中搜索 [英] Search within multilevel json tree using multiple keys

查看:103
本文介绍了使用多个键在多层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"}]

希望这会有所帮助

这篇关于使用多个键在多层JSON树中搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆