2011-07-12 19 views
0

我有一些JSON看起來像:多個關鍵字(即具有正則表達式)搜索通過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匹配它?

回答

0

對於本案這樣的事情應該工作:

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函數以包含更多鍵值對。

這應該可以幫助我們避免使用正則表達式。

+0

感謝您的快速回答!我認爲我的例子太具體了。你的代碼適用於這種情況,但我試圖讓它更具動態性。那麼,如果我想讓它匹配group_id和group_color呢?然後我又被卡住了。 – SortingHat

+0

在我看來,第二個答案將完成這項工作。您只需將'regsObj'更改爲您想要搜索的任何內容即可。 – Ankit

+0

對,唯一的問題是字符串將以任何順序,所以我如何知道前半部分是group_id還是前半部分字符串是group_color?從我們一直在談論的內容來看,我認爲它需要每次都進行一些類型的搜索並縮小搜索對象的範圍。 – SortingHat

0

這是你的對象。

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

感謝您的快速回復!這肯定比我想去的地方更近,但是我有和上面相同的問題:如果我然後想要搜索group_id和group_color,該怎麼辦?我已在我的帖子中添加了一條修改,以嘗試澄清。 – SortingHat

+0

你只需要添加group_color在regsObject以下列方式: VAR regsObj = { 「GROUP_ID」: 「SOME_ID」, 「group_color」 「some_color」 }; – user278064

0

SortingHat - 您可以使用這個JS LIB,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與方法「搜索」 - 與查詢可以使用XPath表達式的JSON結構。