2013-02-28 2 views
6

Data una stringa JSON come questo:Jquery o Javascript controllo se oggetto esiste nella collezione di JSON Oggetti

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

ho bisogno di controllare se esiste un oggetto, controllando tutti i campi, il che significa:

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

O

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

La raccolta può avere qualsiasi numero di oggetti e oggetti avrà sempre un numero uguale di proprietà (id, titolo) o (id, titolo, firstName) ecc.

Inoltre, per verificare l'esistenza di un oggetto esistente, la stringa deve essere analizzata in una raccolta di oggetti JSON?

Ho provato questo:

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

+1 per la Svezia. I <3 Svezia. – L0j1k

+1

Hai fatto il minimo tentativo di risolverlo da solo, giusto? ;) – dfsq

risposta

2

Forse qualcosa del genere?

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

funziona. grazie – ShaneKm

1

Se c'è bisogno di una soluzione generale, e non solo l'esempio, potete verifica lodash (http://lodash.com) che è una libreria performante per tali operazioni, e in particolare la funzione ISEQUAL (http://lodash.com/docs#isEqual).

In alternativa, è possibile estendere il codice sopra riportato per utilizzare valori arbitrari da verificare.

1

Se sei sicuro che le proprietà degli oggetti della collezione sono sempre nello stesso ordine come nella dell'oggetto che si sta cercando, è possibile cercare una stringa invece di controllare presenza dell'oggetto:

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