wake-up-neo.net

Javascript-Suche in einem JSON-Objekt

Ich hatte eine JSON-Zeichenfolge/ein Objekt in meiner Anwendung. 

{"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 ein Filterfeld in meiner Anwendung, und wenn ich einen Namen in dieses Feld eingebe, müssen wir das Objekt filtern und das Ergebnis anzeigen.

Wenn der Benutzer beispielsweise "name" eingibt und auf "search" drückt, müssen wir die vollständigen Namen im JSON-Objekt durchsuchen und das Array zurückgeben, genau wie bei einer MySQL-Suche.

Meine Frage ist, das Json-Objekt mit String zu filtern und das Array zurückzugeben ....

32
ramesh

Sie können einfach durch das Array gehen und die Übereinstimmungen 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]);
    }
}
33
McGarnagle

Wenn Ihre Frage ist, gibt es eine eingebaute Sache, die die Suche nach Ihnen durchführt, dann nein. Sie durchlaufen das Array grundsätzlich mit String#indexOf oder einem regulärer Ausdruck , um die Zeichenfolgen zu testen.

Für die Schleife haben Sie mindestens drei Möglichkeiten:

  1. Eine langweilige alte for-Schleife.

  2. In ES5-fähigen Umgebungen (oder mit einem Shim) gilt Array#filter .

  3. Da Sie jQuery verwenden, jQuery.map .

Langweiliges altes Beispiel für for-Schleife:

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 würden Sie das mit obj.list als source und dem gewünschten Namensfragment als name bezeichnen.

Wenn die Möglichkeit besteht, dass leere Einträge oder Einträge ohne Namen vorhanden sind, ändern Sie die Variable if in:

        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 wenn die Möglichkeit besteht, dass leere Einträge vorhanden sind (z. B. undefined, im Gegensatz zu fehlenden; filter überspringt missing -Einträge), ändern Sie die innere Rückkehr in

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

jQuery.map Beispiel (hier gehe ich davon aus, dass jQuery = $ wie üblich ist; ändern Sie $ in jQuery, wenn Sie noConflict verwenden):

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 falls nötig, fügen Sie erneut entry && entry.name && hinzu.)

31
T.J. Crowder

Verwenden Sie PaulGuo 's jSQL , eine SQL-ähnliche Datenbank, die Javascript verwendet. 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
JackingLiu

Ich habe Regex an die Arbeit mit JSON angepasst.

Stringify zuerst das JSON-Objekt. Dann müssen Sie den Anfang und die Länge der übereinstimmenden Teilzeichenfolgen speichern. Zum Beispiel:

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

Bei einem JSON-String funktioniert dies genau gleich (sofern Sie nicht explizit nach Kommas und geschweiften Klammern suchen. In diesem Fall empfehle ich eine vorherige Transformation Ihres JSON-Objekts, bevor Sie einen Regex ausführen (d. H. Think:, {,}).

Als Nächstes müssen Sie das JSON-Objekt rekonstruieren. Der von mir erstellte Algorithmus tut dies, indem er die JSON-Syntax erkennt, indem er rekursiv vom Übereinstimmungsindex zurückspringt. Zum Beispiel könnte der Pseudo-Code folgendermaßen aussehen:

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 einem regulären Ausdruck ein JSON-Objekt zu filtern, um den Schlüssel, den Wert und die übergeordnete Objektkette zurückzugeben.

Die Bibliothek und den Code, den ich verfasst habe, finden Sie unter http://json.spiritway.co/

0
mikewhit

Wenn Sie dies an mehreren Stellen in Ihrer Anwendung tun, ist es sinnvoll, eine clientseitige JSON-Datenbank zu verwenden, da das Erstellen benutzerdefinierter Suchfunktionen, die von array.filter () aufgerufen werden, unübersichtlich und weniger wartbar ist als die Alternative.

Schauen Sie sich ForerunnerDB an, das ein sehr leistungsfähiges clientseitiges JSON-Datenbanksystem bietet und eine sehr einfache Abfragesprache enthält, die Ihnen hilft, genau das zu tun, wonach 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"}
]
*/

Haftungsausschluss: Ich bin der Entwickler von ForerunnerDB.

0
Rob Evans