2012-05-21 11 views
30

Ich hatte eine JSON-Zeichenfolge/Objekt in meiner Anwendung.Javascript-Suche innerhalb eines JSON-Objekts

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

Ich hatte einen Filterkasten in meiner Anwendung, und wenn ich einen Namen in das Feld eingeben, haben wir das Objekt und zeigt das Ergebnis zu filtern.

Zum Beispiel, wenn der Benutzer „name“ und Hits Suchen, dann müssen wir die vollständigen Namen im JSON-Objekt suchen und das Array zurück, wie eine MySQL Suche ...

Meine Frage ist, filtere das json-Objekt mit string und gebe das Array zurück ....

+3

was haben Sie mit der Suche bisher versucht? Wir helfen Ihnen mit Code, nicht mit einem. – Joseph

+7

SO ist für Fragen * Fragen *. Was ist deine Frage? –

+0

mögliches Duplikat von [jQuerys find() auf JSON-Objekt verwenden] (http://stackoverflow.com/questions/4992383/use-jquerys-find-on-json-object) und [JSON finde in JavaScript] (http://stackoverflow.com/q/1946165/575527) – Joseph

Antwort

30

Sie könnten das Array nur eine Schleife durch und die Spiele finden:

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

Wenn deine Frage ist, gibt es ein eingebautes Ding, das die Suche nach dir macht, dann nein, gibt es nicht. Sie durchlaufen das Array grundsätzlich entweder mit String#indexOf oder regular expression, um die Strings zu testen.

Für die Schleife, müssen Sie mindestens drei Möglichkeiten:

  1. Eine langweilige alte for Schleife.

  2. In ES5-fähigen Umgebungen (oder mit einer Unterlegscheibe), Array#filter.

  3. Weil Sie jQuery verwenden, jQuery.map.

langweilige alte for Schleife Beispiel:

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

Wo Sie, dass mit obj.list als source und dem gewünschten Namen Fragment als name nennen würde.

Oder wenn es eine Chance gibt, gibt es leere Einträge oder Einträge ohne Namen, ändern Sie das if zu:

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

Array#filter Beispiel:

function search(source, name) { 
    var results; 

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

Und wieder, wenn eine Chance, dass es leer ist Einträge (zB undefined, im Gegensatz zu fehlenden; filter überspringen fehlt Einträge), ändern Sie die innere Rückkehr zu:

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

jQuery.map Beispiel (hier gehe ich davon aus jQuery = $ wie es normalerweise der Fall; ändern $ zu jQuery wenn Sie mit 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; 
} 

(Und wieder, fügen Sie entry && entry.name && dort, wenn nötig.)

+0

Ich denke, diese Antwort ist ein bisschen detaillierter als die angenommene. – Neophile

+0

Verwechselt, warum 'source' in der letzten Funktion verwendet wird, in der' $ .map' verwendet wird, da 'source' überhaupt nicht in dieser' search' Funktion verwendet wird, wozu dient der Parameter? es? –

+0

Ich glaube, du hast vergessen, 'source' in die' $ .map' jQuery Funktion zu übergeben. Ansonsten kartieren Sie nichts.Zusätzlich muss 'source' ein zu mappendes Array sein, während' source' in diesem Fall ein 'Objekt' ist und kein Array, daher muss es zuerst an' $ .makeArray' übergeben werden. –

1

Verwenden PaulGuo ‚s jSQL, eine SQL-Datenbank wie Javascript. Zum Beispiel:

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

Ich angepasst Regex für die Arbeit mit JSON.

Zuerst string das JSON-Objekt. Dann müssen Sie die Starts und Längen der übereinstimmenden Teilstrings speichern. Zum Beispiel:

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

Für ein JSON-String, das funktioniert genau das gleiche (wenn Sie nicht ausdrücklich für Kommas und geschweiften Klammern in diesem Fall suchen ich Ihr JSON-Objekt einig vor verwandeln würde empfehlen, vor regex Durchführung (dh think:, {,}).

Als nächstes müssen Sie das JSON-Objekt rekonstruieren.Der Algorithmus, den ich verfasste, erkennt die JSON-Syntax durch rekursive Rückwärtssuche aus dem Übereinstimmungsindex.So könnte der Pseudocode aussehen als folgt:

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 

Mit diesen Informationen ist es möglich, mit regex ein JSON-Objekt zu filtern, um den Schlüssel, den Wert und die übergeordnete Objektkette zurückzugeben.

Sie die Bibliothek sehen und Code, den ich bei http://json.spiritway.co/ Autor

0

Wenn Sie dies in Ihrer Anwendung in mehr als einem Ort tun, wäre es sinnvoll eine clientseitige JSON-Datenbank zu verwenden, da benutzerdefinierte Suchfunktionen zu schaffen, get von array.filter() aufgerufen wird, ist unordentlich und weniger wartbar als die Alternative.

Check out ForerunnerDB, die Sie mit einem sehr leistungsfähigen Client-seitige JSON-Datenbanksystem bietet und enthält eine sehr einfache Abfragesprache Sie genau zu helfen, tun, was Sie suchen:

// 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: Ich bin der Entwickler von ForerunnerDB.

+0

Sieht cool aus, aber nicht relevant – atilkan

-2

Sie können dies versuchen:

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')); 
Verwandte Themen