Question

J'ai des données JSON qui me donnent une liste de langues avec des informations telles que lat / lng, etc. Elles contiennent également une valeur de groupe que j'utilise pour les icônes - et je souhaite créer une légende avec il. Le JSON ressemble à ceci:

{"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"}
]}

Et je souhaite "filtrer" pour finir comme ça:

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

Pour l'instant, voici ce que j'ai à faire: utiliser jQuery pour créer ma légende..mais bien sûr, il affiche toutes les valeurs:

$.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');
    });
});

Comment puis-je récupérer uniquement les paires nom / valeur uniques dans l'ensemble de l'objet JSON, pour une paire donnée?

Était-ce utile?

La solution

Je transformerais le tableau de marqueurs en une paire de valeurs de clé, puis bouclerais les propriétés des objets.

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

puis

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

ou

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

Cet exemple de code remplace la valeur unique par la dernière valeur de la boucle. Si vous souhaitez utiliser la première valeur à la place, vous devrez effectuer une vérification conditionnelle pour voir si la clé existe.

Autres conseils

Pourquoi pas quelque chose de plus générique?

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 seulement une telle fonction renverrait toutes les valeurs distinctes que vous spécifiez, mais elle les regroupera également si vous devez y accéder.

Dans votre exemple, vous utiliseriez:

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

}

Voir ceci- meilleur moyen d'interroger les valeurs d'attributs uniques dans un tableau d'objets javascript?

Vous avez juste besoin d'une variante qui vérifie 2 valeurs plutôt que 1.

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

référence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top