Поиск по нескольким ключевым словам (с регулярным выражением) через JSON - PullRequest
0 голосов
/ 12 июля 2011

У меня есть 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"
}
]

И когда поле найдено, оно переворачивает логический флаг.
например,

for (var c=0; c<json.groups.length; c++) {
   inSearch = false;
   if(json.groups.group_id.match(query)!=null){
      inSearch = true;
   }
}

Однако, если query = Building, тогда я возвращаю два результата, поэтому я хочу установить query = Building&8, чтобы он возвращал только первый результат.

Примечание: запрос также может быть регулярным выражением, которое, я думаю, и должно быть ...

Есть идеи?

РЕДАКТИРОВАТЬ : Есть ли способ, скажем, разбить мою строку на части, а затем сопоставить один объект на основе двух разных частей этого объекта? Итак, сопоставьте первый объект на основе group_id и group_color или сопоставьте его на основе group_name и group_color?

Ответы [ 3 ]

0 голосов
/ 12 июля 2011

Это ваш объект.

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 : {};
};

В regsObject вы определяете reg-exps, которым должен удовлетворять искомый объект в списке групп.

/**
 * 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);
0 голосов
/ 06 января 2014

SortingHat - вы можете использовать эту JS-библиотеку DefiantJS (http://defiantjs.com)) и позволить ей выполнять «тяжелую работу» за вас. Таким образом, ваш код будет более чистым и может выглядеть так:

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;

Вот рабочая скрипка:http://jsfiddle.net/hbi99/3Ry4L/

DefiantJS расширяет глобальный объект JSON методом «поиск», с помощью которого можно выполнять запросы к структуре JSON с выражениями XPath.

0 голосов
/ 12 июля 2011

В данном случае что-то вроде этого должно работать:

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 = function(jsonData,key1, value1, key2, value2){
    // Here jsonData is parsed JSON
    for(var i=0, j=jsonData.length; i<j; i++){
        var obj = jsonData[i];
        if(obj[key1] == value1 && obj[key2] == value2){
            return true; 
     }
     return false;
}

Тогда вы можете использовать его как:

jsonData = JSON.parse('Your json');
if (key_tester(jsonData, "group_id","8","group_name","building"))
   // Here goes your awesome code

Вы можете расширить функцию key_tester, включив в нее больше пар ключ-значение.

Это должно спасти нас от перехода на регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...