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?

Foi útil?

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

}

Veja this- Melhor maneira de consulta volta valores de atributos exclusivos em uma matriz de javascript de objetos?

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

referência

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top