Comment puis-je filtrer & # 8221; JSON pour des paires nom clé / valeur uniques?
-
03-07-2019 - |
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?
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 );
}));