2013-02-28 3 views
6

Podając łańcuch json tak:jQuery lub JavaScript sprawdzić, czy obiekt istnieje w kolekcji JSON Przedmioty

[{"id":28,"Title":"Sweden"},{"id":56,"Title":"USA"},{"id":89,"Title":"England"}] 

muszę sprawdzić, czy obiekt istnieje, sprawdzenie wszystkich pól, co oznacza:

{"id":28,"Title":"Sweden"} => exists 
{"id":29,"Title":"Sweden"} => doesn't exist 

LUB

{"id":28,"Title":"Sweden"} => exists 
{"id":28,"Title":"Sweden2"} => doesn't exist 

zbiór może mieć dowolną liczbę obiektów i przedmiotów będą zawsze miały równą liczbę właściwości (id, title) lub (id, title, firstName) itp.

Również, aby sprawdzić istniejący obiekt, czy ciąg musi zostać sparsowany do kolekcji obiektów Json?

Próbowałem to:

$.map(val, function (obj) { 
    if (obj === val) 
     alert('in'); 
    return obj; // or return obj.name, whatever. 
}); 
+0

+1 do Szwecji. I <3 Szwecja. – L0j1k

+1

Zrobiłeś co najmniej małą próbę rozwiązania go samemu, prawda? ;) – dfsq

Odpowiedz

2

Może coś takiego?

function exists(obj, objs) 
    { 
     var objStr = JSON.stringify(obj); 

     for(var i=0;i<objs.length; i++) 
     { 
      if(JSON.stringify(objs[i]) == objStr) 
      { 
       return 1; 
      } 
     } 

     return 0; 
    } 


    /** some tests **/ 
    var x = [{"id":28,"Title":"Sweden"},{"id":56,"Title":"USA"},{"id":89,"Title":"England"}]; 
    var has = {"id":28,"Title":"Sweden"}; 
    var not = {"id":28,"Title":"Sweden2"}; 

    /* alerts yes */ 
    if(exists(has, x)) alert('yes'); 
    else alert('no'); 

    /* alerts no */ 
    if(exists(not, x)) alert('yes'); 
    else alert('no'); 

http://jsfiddle.net/zdhyf/

+0

to działa. Dziękuję Ci – ShaneKm

1

zakładając trzeba ogólne rozwiązanie, a nie tylko dla przykładu, można kasie lodash (http://lodash.com), który jest wydajnych biblioteki dla takich operacji, a konkretnie funkcję IsEqual (http://lodash.com/docs#isEqual).

Można również przedłużyć powyższy kod, aby użyć arbitralnych wartości do sprawdzenia.

1

Jeżeli jesteś pewien, że właściwości obiektów w kolekcji są zawsze w tej samej kolejności jak w obiekcie, którego szukasz, możesz wyszukać podciągu zamiast sprawdzania obecności obiektu:

var json = '[{"id":28,"Title":"Sweden"},{"id":56,"Title":"USA"},{"id":89,"Title":"England"}]', 
obj1 = {"id":28,"Title":"Sweden"}, 
obj2 = {"id":29,"Title":"Sweden"}; 

alert(json.indexOf(JSON.stringify(obj1)) >= 0 ? 'Yes' : 'No'); // Yes 
alert(json.indexOf(JSON.stringify(obj2)) >= 0 ? 'Yes' : 'No'); // No