2012-05-21 100 views
30

我有我的應用程序中的JSON字符串/對象。Javascript搜索內部JSON對象

{"list": [ 
    {"name":"my Name","id":12,"type":"car owner"}, 
    {"name":"my Name2","id":13,"type":"car owner2"}, 
    {"name":"my Name4","id":14,"type":"car owner3"}, 
    {"name":"my Name4","id":15,"type":"car owner5"} 
]} 

我在我的應用程序中有一個過濾器框,當我在該框中輸入名稱時,我們必須過濾對象並顯示結果。

例如,如果用戶鍵入「名」,並點擊搜索,那麼我們必須尋找全名在JSON對象,並返回數組,就像一個MySQL搜索...

我的問題是過濾JSON對象的字符串,並返回數組....

+3

你有什麼用搜索試過這麼遠?我們幫助您使用代碼,而不是爲您提供一個。 – Joseph

+7

SO是提問*問題*。你有什麼問題? –

+0

[在json對象上使用jQuery的find()]的可能的重複](http://stackoverflow.com/questions/4992383/use-jquerys-find-on-json-object)和[在JavaScript中找到JSON](http:///stackoverflow.com/q/1946165/575527) – Joseph

回答

30

你可以只通過數組循環,找到匹配:

var results = []; 
var searchField = "name"; 
var searchVal = "my Name"; 
for (var i=0 ; i < obj.list.length ; i++) 
{ 
    if (obj.list[i][searchField] == searchVal) { 
     results.push(obj.list[i]); 
    } 
} 
29

如果您的問題是,有一些內置的東西,將爲您做搜索,然後不,沒有。您基本上使用String#indexOfregular expression來遍歷數組來測試字符串。

對於循環,你至少有三種選擇:

  1. 一個無聊的老for循環。

  2. 在支持ES5的環境中(或使用墊片),Array#filter

  3. 因爲你使用的是jQuery,所以jQuery.map

無聊的老for循環示例:

function search(source, name) { 
    var results = []; 
    var index; 
    var entry; 

    name = name.toUpperCase(); 
    for (index = 0; index < source.length; ++index) { 
     entry = source[index]; 
     if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) { 
      results.push(entry); 
     } 
    } 

    return results; 
} 

在哪裏你會打電話與obj.listsource和所需的名稱片段作爲name

或者,如果有任何機會有空白條目或條目沒有名字,改if到:再次

function search(source, name) { 
    var results; 

    name = name.toUpperCase(); 
    results = source.filter(function(entry) { 
     return entry.name.toUpperCase().indexOf(name) !== -1; 
    }); 
    return results; 
} 

而且,如果有機會,有空白:

 if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) { 

Array#filter例子條目(例如,undefined,而不是丟失; filter將跳過丟失條目),將內部返回更改爲:

 return entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1; 

jQuery.map example(這裏我假設jQuery = $通常情況下;如果你正在使用noConflict)改變$jQuery

function search(source, name) { 
    var results; 

    name = name.toUpperCase(); 
    results = $.map(source, function(entry) { 
     var match = entry.name.toUpperCase().indexOf(name) !== -1; 
     return match ? entry : null; 
    }); 
    return results; 
} 

(再次,如果需要的話在裏面添加entry && entry.name &&。)

+0

我認爲這個答案比接受的更詳細一點。 – Neophile

+0

混淆了爲什麼''source'在最後一個使用'$ .map'的函數中被使用,因爲在'search'函數中'source'甚至沒有被使用,參數的重點是什麼它? –

+0

我想你忘了將'source'傳遞到'$ .map' jQuery函數中。否則,你沒有映射任何東西。另外,'source'需要是一個要映射的數組,而本例中的'source'是一個'object'而不是一個數組,所以它需要首先傳遞給'$ .makeArray'。 –

1

使用PaulGuojSQL,使用JavaScript像數據庫的SQL。例如:

var db = new jSQL(); 
db.create('dbname', testListData).use('dbname'); 
var data = db.select('*').where(function(o) { 
    return o.name == 'Jacking'; 
}).listAll(); 
-1

我修改了正則表達式以使用JSON。

首先,對JSON對象進行字符串化。然後,您需要存儲匹配的子字符串的開始和長度。例如:

"matched".search("ch") // yields 3 

對於一個JSON字符串,這個工程完全一樣的(除非您是逗號和花括號在這種情況下,我建議在執行正則表達式之前,你的JSON對象的一些現有的變換明確搜索(即想要:{,})。

接下來,您需要重建JSON對象。我創作的算法通過從匹配索引遞歸地檢測JSON語法來檢測JSON語法,例如,僞代碼可能看起來像如下:

find the next key preceding the match index, call this theKey 
then find the number of all occurrences of this key preceding theKey, call this theNumber 
using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times 
return this object called parentChain 

使用這些信息,可以使用正則表達式來過濾JSON對象以返回鍵,值和父對象鏈。

您可以看到該庫和代碼,我在http://json.spiritway.co/

0

撰寫。如果你在你的應用程序這樣做在一個以上的地方,將是有意義的使用客戶端的JSON數據庫,因爲創建自定義的搜索功能是被array.filter()調用是比較麻煩和不易維護的。

退房ForerunnerDB它爲您提供了一個非常強大的客戶端JSON數據庫系統,包括一個非常簡單的查詢語言來幫助你做你正在尋找什麼:

// Create a new instance of ForerunnerDB and then ask for a database 
var fdb = new ForerunnerDB(), 
    db = fdb.db('myTestDatabase'), 
    coll; 

// Create our new collection (like a MySQL table) and change the default 
// primary key from "_id" to "id" 
coll = db.collection('myCollection', {primaryKey: 'id'}); 

// Insert our records into the collection 
coll.insert([ 
    {"name":"my Name","id":12,"type":"car owner"}, 
    {"name":"my Name2","id":13,"type":"car owner2"}, 
    {"name":"my Name4","id":14,"type":"car owner3"}, 
    {"name":"my Name4","id":15,"type":"car owner5"} 
]); 

// Search the collection for the string "my nam" as a case insensitive 
// regular expression - this search will match all records because every 
// name field has the text "my Nam" in it 
var searchResultArray = coll.find({ 
    name: /my nam/i 
}); 

console.log(searchResultArray); 

/* Outputs 
[ 
    {"name":"my Name","id":12,"type":"car owner"}, 
    {"name":"my Name2","id":13,"type":"car owner2"}, 
    {"name":"my Name4","id":14,"type":"car owner3"}, 
    {"name":"my Name4","id":15,"type":"car owner5"} 
] 
*/ 

免責聲明:我是ForerunnerDB的開發者。

+0

看起來很酷但不相關 – atilkan

-2

你可以試試這個:

function search(data,search) { 
    var obj = [], index=0; 
    for(var i=0; i<data.length; i++) { 
     for(key in data[i]){ 
     if(data[i][key].toString().toLowerCase().indexOf(search.toLowerCase())!=-1) { 
       obj[index] = data[i]; 
       index++; 
       break; 
     } 
    } 
    return obj; 
} 
console.log(search(obj.list,'my Name'));