是否可以通過JSON對象執行復雜查詢?我對JavaScript或jQuery解決方案持開放態度,越容易越好。我在設想一種類似於LINQ或SQL的函數式編程語言。如何解析或查詢JavaScript中的複雜JSON
我不希望其他第三方庫或加載項。
UPDATE
從早期的答案的容貌,一個附加的將是必要的。在這種情況下,我更喜歡使用不需要安裝過程的附加組件。與軟件發佈一樣部署的東西(如jQuery)是好的(例如* .js文件集)。
是否可以通過JSON對象執行復雜查詢?我對JavaScript或jQuery解決方案持開放態度,越容易越好。我在設想一種類似於LINQ或SQL的函數式編程語言。如何解析或查詢JavaScript中的複雜JSON
我不希望其他第三方庫或加載項。
UPDATE
從早期的答案的容貌,一個附加的將是必要的。在這種情況下,我更喜歡使用不需要安裝過程的附加組件。與軟件發佈一樣部署的東西(如jQuery)是好的(例如* .js文件集)。
嗯... YQL做這種事情,但那將是第三方。
您可以與jQuery的$.grep(array,filterfn)
方法
var newArr = $.grep(oldArr,function(elInArray,index){
return elInArray.key === somevalue;
});
過濾的陣列,當然可以使用一個正則表達式在那裏如果願意,也可以使用鍵內更復雜的條件,如檢查多個鍵,鍵,鍵內的數組等。
使用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(source,reviver)
此方法解析JSON文本以生成對象或數組。它可以拋出一個SyntaxError異常。
可選的reviver參數是一個可以過濾和轉換結果的函數。它接收每個鍵和值,並使用其返回值而不是原始值。如果它返回它收到的內容,那麼該結構不會被修改。如果它返回undefined,那麼該成員將被刪除。
reviver最終會調用空字符串和最頂層的值來允許轉換最上面的值。一定要正確處理這種情況,通常通過返回提供的值,否則JSON.parse將返回undefined。
if (k === "") return v
JSON.stringify(值,替換器,空間)
的字符串化方法產生從一個JavaScript值的JSON文本。如果value是一個對象或數組,則會遞歸訪問該結構以確定每個membr或元素的序列化。結構不能是週期性的。
找到對象值時,如果對象包含toJSON方法,則會調用其toJSON方法,結果將被字符串化。 toJSON方法不會序列化:它返回應該序列化的名稱/值對所表示的值,或者如果沒有序列化,則返回undefined。 toJSON方法將傳遞與該值關聯的鍵,並且這將綁定到持有該鍵的對象。
您可以提供一個可選替換方法。它將傳遞每個成員的鍵和值,並將其綁定到包含對象。從您的方法返回的值將被序列化。如果你的方法返回undefined,那麼該成員將被排除在序列化之外。
如果replacer參數是一個數組,那麼它將用於選擇要序列化的成員。它過濾結果,只有在替換者數組中列出的鍵的成員才被字符串化。
不具有JSON表示的值(例如未定義或函數)將不會被序列化。對象中的這些值將被丟棄;在數組中它們將被替換爲null。您可以使用替代函數來替換具有JSON值的替代函數。 JSON.stringify(undefined)返回undefined。
可選的空格參數會生成一個用換行符和縮進填充的值的字符串化,以便於閱讀。
如果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"}"
參考
完成任務沒有標準。這就是我需要知道的。 –