2012-05-21 8 views
30

Posiadałem ciąg JSON/obiekt w mojej aplikacji.Wywołanie JavaScript wewnątrz obiektu 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"} 
]} 

miałem obudowę filtra w mojej aplikacji, a gdy wpisuję nazwę na tym polu, musimy filtrować obiekt i wyświetla wynik.

Na przykład, jeśli użytkownik wpisze „nazwa” i uderza szukanie, to musimy szukać pełnych nazw w obiekcie JSON i zwróci tablicę, podobnie jak poszukiwanie MySQL ...

Moje pytanie jest filtruj obiekt json z ciągiem znaków i zwróć tablicę ...

+3

co próbowałeś do tej pory poszukiwania? pomożemy ci z kodem, nie zapewniamy go. – Joseph

+7

SO służy do zadawania * pytań *. Jakie jest Twoje pytanie? –

+0

możliwy duplikat [użyj jQuery's find() na obiekcie JSON] (http://stackoverflow.com/questions/4992383/use-jquerys-find-on-json-object) i [JSON znajdź w JavaScript] (http: // /stackoverflow.com/q/1946165/575527) – Joseph

Odpowiedz

30

Można po prostu pętli tablicy i znaleźć mecze:

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

Jeśli masz jakieś pytanie, czy jest jakieś wbudowane urządzenie, które wyszuka ciebie, to nie, nie ma. Zasadniczo przechodzisz przez macierz za pomocą String#indexOf lub regular expression, aby przetestować ciągi.

Na pętli, masz co najmniej trzy możliwości:

  1. nudny stary for pętlę.

  2. W środowiskach z obsługą ES5 (lub z podkładką), Array#filter.

  3. Ponieważ używasz jQuery, jQuery.map.

Boring stary przykład for pętla:

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

Jeżeli chcesz zadzwonić, że z obj.list jako source i pożądanej nazwy fragmentu jako name.

Albo czy istnieje jakaś szansa istnieje puste wpisy lub wpisy bez nazwy, zmienić if do:

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

Array#filter przykład:

function search(source, name) { 
    var results; 

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

i znowu, jeśli jakaś szansa, że ​​są puste wpisów (np. undefined, w przeciwieństwie do brakujących; filter pominie brakujących wpisów), zmień wewnętrzny powrót na:

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

jQuery.map przykład (tutaj jestem przy założeniu jQuery = $ jak to zwykle bywa; zmienić $ do jQuery jeśli używasz 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; 
} 

(I znowu, dodać entry && entry.name && tam, jeśli to konieczne.)

+0

Myślę, że ta odpowiedź jest nieco bardziej szczegółowa niż zaakceptowana. – Neophile

+0

Zastanawia się, dlaczego 'source' jest używane w ostatniej funkcji, w której' $ .map' jest używany, ponieważ 'source' nie jest nawet w ogóle używane w funkcji' search', jaki jest sens parametru dla to? –

+0

Myślę, że zapomniałeś przekazać 'source' do funkcji' $ .map' jQuery tutaj. w przeciwnym razie nic nie mapujesz.Dodatkowo, 'source' musi być tablicą do zmapowania, podczas gdy' source' w tym przypadku jest 'obiektem' nie tablicą, więc najpierw musi być przekazana do' $ .makeArray'. –

1

Zastosowanie PaulGuo „s jSQL, jak SQL bazy danych przy użyciu javascript. Na przykład:

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

Zaadaptowałem regex do pracy z JSON.

Najpierw należy uszeregować obiekt JSON. Następnie należy przechowywać początki i długości dopasowanych podciągów. Na przykład:

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

na ciąg JSON, to działa dokładnie tak samo (chyba, że ​​są wyraźnie szukając dla przecinkami i nawiasów klamrowych w tym przypadku ja polecam niektóre przed przekształcić swojego obiektu JSON przed wykonaniem regex (tj think:, {,}).)

Następnie należy zrekonstruować obiekt JSON, a algorytm, który stworzyłem, wykonuje to wykrywając składnię JSON przez rekursywne przechodzenie wstecz od indeksu dopasowań, na przykład pseudo kod może wyglądać tak to:

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 

Dzięki tym informacjom możliwe jest użycie wyrażenia regularnego do filtrowania obiektu JSON w celu zwrócenia klucza, wartości i nadrzędnego łańcucha obiektów.

można zobaczyć bibliotekę i kodu I autorami w http://json.spiritway.co/

0

Jeśli robisz to w więcej niż jednym miejscu w aplikacji byłoby sensu używać bazy danych po stronie klienta JSON ponieważ tworzenie niestandardowych funkcji wyszukiwania, wywołanie przez array.filter() jest bałaganiarski i mniej konserwowalny niż alternatywa.

Wyjazd ForerunnerDB który oferuje bardzo silny po stronie klienta systemu baz danych JSON i obejmuje bardzo prosty język zapytań, które pomogą Ci zrobić dokładnie to, czego szukasz:

// 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: Jestem twórca ForerunnerDB.

+0

Wygląda fajnie, ale bez znaczenia – atilkan

-2

Można spróbować to:

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