Javascript 通过JSON搜索多个关键字(包含正则表达式)

Javascript 通过JSON搜索多个关键字(包含正则表达式),javascript,json,search,Javascript,Json,Search,我有一些JSON看起来像: "groups": [ "group_id": "8", "group_name": "Building", "group_color": "00ff00" }, { "group_id": "3", "group_name": "Building", "group_color": "8000ff" }, { "group_id": "2", "group_name": "Sidewalk", "group_color": "ff

我有一些JSON看起来像:

"groups": [

  "group_id": "8",
  "group_name": "Building",
  "group_color": "00ff00"
},
{
  "group_id": "3",
  "group_name": "Building",
  "group_color": "8000ff"
},
{
  "group_id": "2",
  "group_name": "Sidewalk",
  "group_color": "ff0000"
},
{
  "group_id": "6",
  "group_name": "Parking Lot",
  "group_color": "00ffff"
},
{
  "group_id": "3",
  "group_name": "Commons",
  "group_color": "ff8000"
},
{
  "group_id": "5",
  "group_name": "Other",
  "group_color": "ff00ff"
}
]
当找到一个字段时,它会翻转一个布尔标志。
e、 g


for(var c=0;c对于目前的情况,类似这样的方法应该有效:

data = JSON.parse('your_json');
for (var i=0, j=data.length; i<j; i++){
    var inSearh = false;
    if(data[i].group_id===8 && data[i].group_name==="Something"){
    inSearch = true;
    break;
    }
}
您可以扩展key_tester功能以包括更多的键值对

这应该可以避免我们使用正则表达式。

这是您的对象

var jsonObj = {
"groups": [
    {
    "group_id": "8",
    "group_name": "Building",
    "group_color": "00ff00"},
{
    "group_id": "3",
    "group_name": "Building",
    "group_color": "8000ff"},
{
    "group_id": "2",
    "group_name": "Sidewalk",
    "group_color": "ff0000"},
{
    "group_id": "6",
    "group_name": "Parking Lot",
    "group_color": "00ffff"},
{
    "group_id": "3",
    "group_name": "Commons",
    "group_color": "ff8000"},
{
    "group_id": "5",
    "group_name": "Other",
    "group_color": "ff00ff"}
]
};
此函数用于检查对象属性是否满足 regsObj中定义的正则表达式

/**
 * Check that an obejct matches all the 
 * regexp defined in the regsObj
 */
 var matchRegObj = function(obj, regsObj) {
     var matched = false,
         regExp;

    for (var propName in regsObj) {
       regExp = regsObj[propName];
       matched = regExp.test(obj[propName]);

       if (matched !== true) {
          break;
       }
    }

    return matched;
};
函数测试返回匹配的对象

  /**
   * Return the first object matching all the regexp rule
   * defined in the regsObj.
   */
  var test = function(jsonObj, regsObj) {
    var matched = false,
        obj;

    for (var i = 0;  i < jsonObj.groups.length && !matched; i++) {
       obj = jsonObj.groups[i];
       matched = matchRegObj(obj, regsObj);
    }

    return (matched) ? obj : {};
};
以这种方式搜索对象

 /**
  * @param {Object} jsonObjyour Your json Object.
  * @param {Object} regObj The object holding all the regular expressions.
  * @return {Object} your matching object
  */
 var result = test(jsonObj, regsObj);
 console.dir(result);

SortingHat-您可以使用这个JS库,definatitJS(),让它为您完成“繁重的工作”。这样,您的代码更干净,可以如下所示:

var data = {
   "groups": [
      { "group_id": "8", "group_name": "Building",    "group_color": "00ff00" },
      { "group_id": "3", "group_name": "Building",    "group_color": "8000ff" },
      { "group_id": "2", "group_name": "Sidewalk",    "group_color": "ff0000" },
      { "group_id": "6", "group_name": "Parking Lot", "group_color": "00ffff" },
      { "group_id": "3", "group_name": "Commons",     "group_color": "ff8000" },
      { "group_id": "5", "group_name": "Other",       "group_color": "ff00ff" }
   ]
},
res = JSON.search( data, '//*[group_name="Building" and group_id=8]' )
output = document.getElementById('output');

output.innerHTML = JSON.stringify( res[0], null, '   ' );
output.style.backgroundColor = '#'+ res[0].group_color;
这是工作小提琴:


DefiantJS使用“search”方法扩展了全局对象JSON-哪些查询可以通过XPath表达式在JSON结构上进行。

感谢您的快速回答!我认为我的示例太具体了。您的代码适用于一种情况,但我正在尝试使其更具动态性。因此,如果我希望它与组id和组颜色匹配,该怎么办?然后我再次陷入困境。在我看来,第二个答案将实现job.您只需将
regsObj
更改为您想要搜索的内容。对,唯一的问题是字符串的顺序是任意的,那么我如何知道前半部分是group\u id还是前半部分是group\u颜色?根据我们所说的,我认为它需要执行某种类型的sea每次搜索并缩小搜索对象的范围?好的,这可能看起来不太优雅,但我正在用我认为可以解决您问题的内容更新我的答案。感谢您的快速回复!这肯定离我想去的地方更近了,但我有与上面相同的问题:如果我想搜索组id和组颜色呢?我已经添加了对我的帖子进行编辑以尝试澄清。您只需按以下方式在regsObj对象中添加group_color:var regsObj={“group_id”:“some_id”,“group_color”“some_color”};
  /**
   * Return the first object matching all the regexp rule
   * defined in the regsObj.
   */
  var test = function(jsonObj, regsObj) {
    var matched = false,
        obj;

    for (var i = 0;  i < jsonObj.groups.length && !matched; i++) {
       obj = jsonObj.groups[i];
       matched = matchRegObj(obj, regsObj);
    }

    return (matched) ? obj : {};
};
/**
 * regsObj is only a container of propertyName and regexp used to query the right object.
 */
var regsObj = {
   "group_id" : "10",
   "group_name" : "Building" 
};
 /**
  * @param {Object} jsonObjyour Your json Object.
  * @param {Object} regObj The object holding all the regular expressions.
  * @return {Object} your matching object
  */
 var result = test(jsonObj, regsObj);
 console.dir(result);
var data = {
   "groups": [
      { "group_id": "8", "group_name": "Building",    "group_color": "00ff00" },
      { "group_id": "3", "group_name": "Building",    "group_color": "8000ff" },
      { "group_id": "2", "group_name": "Sidewalk",    "group_color": "ff0000" },
      { "group_id": "6", "group_name": "Parking Lot", "group_color": "00ffff" },
      { "group_id": "3", "group_name": "Commons",     "group_color": "ff8000" },
      { "group_id": "5", "group_name": "Other",       "group_color": "ff00ff" }
   ]
},
res = JSON.search( data, '//*[group_name="Building" and group_id=8]' )
output = document.getElementById('output');

output.innerHTML = JSON.stringify( res[0], null, '   ' );
output.style.backgroundColor = '#'+ res[0].group_color;