是否可以对JSON对象执行复杂查询?我对JavaScript或jQuery解决方案持开放态度越大越好。我正在设想一种类似于LINQ或SQL的函数式编程语言。
我不喜欢其他第三方库或附加组件。
更新
从早期答案的外观来看,一个附加组件将是必要的。在这种情况下,我更喜欢一个不需要安装过程的附加组件。使用软件发布(如jQuery)部署的东西很好(例如* .js文件集)。
答案 0 :(得分:3)
当你与它交互时,它不是一个“JSON对象”,它是一个JavaScript对象。 (“JSON对象”仅存在于数据表示法中。)JavaScript本身没有任何高级函数编程结构,因此您需要第三方库来完成此类事情。 JavaScript几乎只有属性访问器,“这个对象是否具有此名称的属性?”的运算符。 (in
,hasOwnProperty
),以及第5版(尚未得到广泛支持),一些方便的特定于阵列的功能,如forEach
,every
,{{3} },map
等。
答案 1 :(得分:3)
答案 2 :(得分:1)
使用JSON.stringify
和replacer
回调来实现此目的:
function replacer(match, offset, fullstring)
{
return replacer.str;
}
replacer.str = "\u0022filterValues\u0022:[\u0022hi\u0022,\u0022bye\u0022]"; /* Use DOM node value */
var foo = JSON.stringify({
"Region": {
"filterField": "kw_Region",
"filterValues": [
"aa",
"bb"
]
},
"ApplicationName": {
"filterField": "kw_ApplicationName",
"filterValues": [
"aa",
"bb"
]
},
"IssueType": {
"filterField": "kw_IssueType",
"filterValues": [
"aa",
"bb"
]
},
"Outage": {
"filterField": "kw_Outage",
"filterValues": [
"aa",
"bb"
]
},
"Priority": {
"filterField": "kw_Priority",
"filterValues": [
"aa",
"bb"
]
}
}).replace(/"filterValues[^\]]+./g, replacer)
以下是有关序列化和转换的两种JSON方法的一些文档,stringify
和parse
:
JSON.parse(来源,复活)
此方法解析JSON文本以生成对象或数组。它可以抛出一个SyntaxError异常。
可选的reviver参数是一个可以过滤和转换结果的函数。它接收每个键和值,并使用其返回值代替原始值。如果它返回它收到的内容,则不修改结构。如果它返回undefined,则删除该成员。
最终使用空字符串和最高值调用reviver,以允许转换最顶层的值。一定要正确处理这种情况,通常是返回提供的值,否则JSON.parse将返回undefined。
if (k === "") return v
JSON.stringify(值,替换者,空格)
stringify方法从JavaScript值生成JSON文本。如果value是对象或数组,则将递归访问该结构以确定每个元素或元素的序列化。结构不得是周期性的。
当找到对象值时,如果对象包含toJSON方法,则将调用其toJSON方法并将结果进行字符串化。 toJSON方法没有序列化:它返回应该序列化的名称/值对表示的值,如果没有任何序列化,则返回undefined。 toJSON方法将传递与该值相关联的键,并且这将绑定到持有该键的对象。
您可以提供可选的替换方法。它将传递每个成员的键和值,并将其绑定到包含对象。从您的方法返回的值将被序列化。如果您的方法返回undefined,则该成员将从序列化中排除。
如果replacer参数是一个数组,那么它将用于选择要序列化的成员。它会过滤结果,以便只有具有在replacer数组中列出的键的成员才会被字符串化。
不具有JSON表示的值(例如未定义或函数)将不会被序列化。对象中的这些值将被删除;在数组中,它们将被替换为null。您可以使用replacer函数替换具有JSON值的函数。 JSON.stringify(undefined)返回undefined。
可选的space参数生成一个值的字符串化,该值用换行符和缩进填充,以便于阅读。
如果space参数是非空字符串,则该字符串将用于缩进。如果space参数是一个数字,那么缩进将是那么多空格。
var alias = {"Clark":"","phone":""};
function kryptonite(key)
{
var replacement = {};
for(var cursor in this)
{
if(cursor in alias)
replacement[cursor] = this[cursor]
}
return replacement;
}
var contact = {
"Clark":"Kent",
"Kal El":"Superman",
"phone":"555-7777"
}
contact.toJSON = kryptonite;
var foo = JSON.stringify(contact) // "{"Clark":"Kent","phone":"555-7777"}"
<强>参考强>
答案 3 :(得分:0)
嗯...... YQL就是这样做的,但那将是第三方。
您可以使用jQuery $.grep(array,filterfn)
方法
var newArr = $.grep(oldArr,function(elInArray,index){
return elInArray.key === somevalue;
});
如果您愿意,您当然可以在那里使用正则表达式,或者使用更复杂的条件,例如检查多个键,键内的键,键内的数组等。