Búsqueda de sitios web

javascript - ¿Cómo puedo "filtrar" JSON para pares de nombre/valor de clave únicos?


Tengo algunos datos JSON que me están dando una lista de idiomas con información como latitud/longitud, etc. También contiene un valor de grupo que estoy usando para los íconos, y quiero construir una leyenda con él. El JSON se ve algo así:

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

Y quiero "filtrarlo" para que quede así:

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

En este momento tengo esto, usando jQuery para crear mi leyenda... pero por supuesto está trayendo todos los 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');
    });
});

¿Cómo puedo capturar solo los pares nombre/valor únicos en todo el objeto JSON, para un par dado?

Respuesta #1

Transformaría el array de marcadores en un par clave-valor y luego recorrería las propiedades de ese objeto.

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

entonces

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

Este ejemplo de código sobrescribe el valor único con el último valor en el bucle. Si deseas usar el primer valor en su lugar, tendrás que realizar alguna verificación condicional para ver si la clave existe.

Respuesta #2

¿Qué tal algo más 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.
}

No solo una función así devolvería todos los valores distintos que especifiques, sino que también los agrupará si necesitas acceder a ellos.

En su muestra usted usaría:

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

}