我有一些看起来像的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<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 :(得分: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函数以包含更多键值对。
这应该可以使我们不再采用正则表达式。
答案 1 :(得分: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-exp。
/**
* 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);
答案 2 :(得分:0)
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 - 可以使用XPath表达式在JSON结构上进行查询。