Ricerca Javascript all’interno di un object JSON

Ho avuto una stringa / object JSON nella mia applicazione.

{"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"} ]} 

Avevo una scatola filtro nella mia applicazione, e quando digito un nome in quella casella, dobbiamo filtrare l’object e visualizzare il risultato.

Ad esempio, se l’utente digita “nome” e fa una ricerca, dobbiamo cercare i nomi completi nell’object JSON e restituire l’array, proprio come una ricerca MySQL …

La mia domanda è quella di filtrare l’object json con una stringa e restituire l’array ….

Potresti semplicemente scorrere l’array e trovare le corrispondenze:

 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]); } } 

Se la tua domanda è, c’è qualche cosa built-in che ti farà la ricerca, poi no, non c’è. In pratica String#indexOf un ciclo attraverso l’array usando String#indexOf o un’espressione regolare per testare le stringhe.

Per il ciclo, hai almeno tre scelte:

  1. Un vecchio noioso for ciclo.

  2. Sui ambienti abilitati ES5 (o con uno spessore), Array#filter .

  3. Perché stai usando jQuery, jQuery.map .

Boring old for loop esempio:

 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; } 

Dove lo chiameresti con obj.list come source e il frammento del nome desiderato come name .

O se c'è qualche possibilità ci sono voci vuote o voci senza nomi, modificare il if a:

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

Esempio di Array#filter :

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

E ancora, se qualche possibilità che ci siano voci vuote (ad esempio, undefined , al contrario di mancante, il filter salterà le voci mancanti ), cambia il ritorno interno a:

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

Esempio di jQuery.map (qui sto assumendo jQuery = $ come di solito è il caso, cambia $ in jQuery se stai usando noConflict ):

 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; } 

(E ancora, aggiungi la entry && entry.name && se necessario).

Usa jSQL di PaulGuo , un database simile a SQL usando javascript. Per esempio:

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

Ho adattato regex per lavorare con JSON.

Per prima cosa, stringa l’object JSON. Quindi, è necessario memorizzare le partenze e le lunghezze delle sottostringhe corrispondenti. Per esempio:

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

Per una stringa JSON, funziona esattamente allo stesso modo (a meno che tu non stia cercando esplicitamente le virgole e le parentesi graffe, nel qual caso raccomanderei alcune trasformazioni precedenti del tuo object JSON prima di eseguire espressioni regolari (ovvero pensare:, {,}).

Successivamente, è necessario ribuild l’object JSON. L’algoritmo che ho creato lo fa rilevando la syntax JSON andando in modo ricorsivo dall’indice della partita. Ad esempio, lo pseudo codice potrebbe apparire come segue:

 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 

Con queste informazioni, è ansible utilizzare regex per filtrare un object JSON per restituire la chiave, il valore e la catena di oggetti padre.

Puoi vedere la libreria e il codice che ho creato su http://json.spiritway.co/

Se lo stai facendo in più di un posto nella tua applicazione, avrebbe senso usare un database JSON sul lato client perché creare funzioni di ricerca personalizzate che vengono chiamate da array.filter () è disordinato e meno gestibile dell’alternativa.

Scopri ForerunnerDB che ti fornisce un potente sistema di database JSON lato client e include un linguaggio di query molto semplice per aiutarti a fare esattamente quello che stai cercando:

 // 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"} ] */ 

Disclaimer: sono lo sviluppatore di ForerunnerDB.

Puoi provare questo:

 function search(data,search) { var obj = [], index=0; for(var i=0; i