Como eu posso “filtro” JSON para pares nome / valor de chave única?
-
03-07-2019 - |
Pergunta
Eu tenho alguns dados JSON que está me dando uma lista de idiomas com informações como latitude / longitude, etc. Ele também contém um valor grupo que eu estou usando para ícones - e eu quero construir uma lenda com isto. O JSON é algo como isto:
{"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 eu quero "filtro" para acabar assim:
{"markers":[
{"group":"a", "value":"yes"},
{"group":"b", "value":"no"},
{"group":"c", "value":"NA"}
]}
Agora eu tenho isto, usando jQuery para criar o meu legend..but é claro que está puxando em todos os valores:
$.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');
});
});
Como só posso pegar os pares nome / valor únicos em todo o objeto JSON, para um determinado par?
Solução
eu transformar a matriz de marcadores a um par de valores de chave e, em seguida, loop que objetos propriedades.
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;
});
então
$.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');
}
Este exemplo de código substitui o valor único, com o último valor no circuito. Se você quiser usar o primeiro valor em vez disso você terá que realizar alguma verificação condicional para ver se existe a chave.
Outras dicas
Como sobre algo mais genérico?
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.
}
Não só tal função seria devolver todos os valores distintos especificados, mas que também irá agrupá-los se você precisar acessá-los.
Em sua amostra você usaria:
$.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');
}
Você só precisa de uma variação que verifica a existência de 2 valores, em vez de 1.
var markers = _.uniq( _.collect( markers , function( x ){
return JSON.stringify( x );
}));