Domanda

Ho alcuni dati JSON che mi stanno dando un elenco di lingue con informazioni come lat / lng, ecc. Contiene anche un valore di gruppo che sto usando per le icone - e voglio creare una legenda con esso. JSON è simile al seguente:

{"markers":[
  {"language":"Hungarian","group":"a", "value":"yes"},
  {"language":"English", "group":"a", "value":"yes"},
  {"language":"Ewe", "group":"b", "value":"no"},
  {"language":"French", "group":"c", "value":"NA"}
]}

E voglio " filtrare " per finire così:

{"markers":[
 {"group":"a", "value":"yes"},
 {"group":"b", "value":"no"},
 {"group":"c", "value":"NA"}
]}

In questo momento ho questo, usando jQuery per creare la mia leggenda ... ma ovviamente sta estraendo tutti i valori:

$.getJSON("http://127.0.0.1:8000/dbMap/map.json", function(json){
    $.each(json.markers, function(i, language){
        $('<p>').html('<img src="http://mysite/group' + language.group + '.png\" />' + language.value).appendTo('#legend-contents');
    });
});

Come posso prendere solo le coppie univoche nome / valore nell'intero oggetto JSON, per una data coppia?

È stato utile?

Soluzione

Trasformerei l'array di marker in una coppia chiave-valore e quindi eseguo il ciclo delle proprietà degli oggetti.

var markers = [{"language":"Hungarian","group":"a", "value":"yes"}, 
  {"language":"English", "group":"a", "value":"yes"}, 
  {"language":"Ewe", "group":"b", "value":"no"},
  {"language":"French", "group":"c", "value":"NA"}];

var uniqueGroups = {};
$.each(markers, function() {
  uniqueGroups[this.group] = this.value;
});

quindi

$.each(uniqueGroups, function(g) {
  $('<p>').html('<img src="http://mysite/group' + g + '.png\" />' + this).appendTo('#legend-contents');
});

o

for(var g in uniqueGroups)
{
  $('<p>').html('<img src="http://mysite/group' + g + '.png\" />' + uniqueGroups[g]).appendTo('#legend-contents');
}

Questo esempio di codice sovrascrive il valore univoco con l'ultimo valore nel ciclo. Se invece desideri utilizzare il primo valore, dovrai eseguire un controllo condizionale per vedere se la chiave esiste.

Altri suggerimenti

Che ne dici di qualcosa di più generico?

function getDistinct(o, attr)
{
 var answer = {};
 $.each(o, function(index, record) {
   answer[index[attr]] = answer[index[attr]] || [];
   answer[index[attr]].push(record);
 });

 return answer;    //return an object that has an entry for each unique value of attr in o as key, values will be an array of all the records that had this particular attr.
}

Non solo una tale funzione restituirebbe tutti i valori distinti specificati, ma li raggrupperà anche se è necessario accedervi.

Nel tuo esempio useresti:

$.each(getDistinct(markers, "group"), function(groupName, recordArray)
{ var firstRecord = recordArray[0];
        $('<p>').html('<img src="http://mysite/group' + groupName+ '.png\" />' + firstRecord.value).appendTo('#legend-contents');

}

Vedi questo- Il modo migliore per interrogare indietro valori di attributi univoci in una matrice di oggetti javascript?

Hai solo bisogno di una variazione che controlli 2 valori anziché 1.

var markers  = _.uniq( _.collect( markers , function( x ){
                        return JSON.stringify( x ); 
                    })); 

riferimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top