¿Cómo puedo & # 8220; filtrar & # 8221; ¿JSON para pares únicos de nombre / valor de clave?

StackOverflow https://stackoverflow.com/questions/604935

Pregunta

Tengo algunos datos JSON que me proporcionan una lista de idiomas con información como lat / lng, etc. También contiene un valor de grupo que estoy usando para los iconos, y quiero crear una leyenda con eso. El JSON se ve algo como esto:

{"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 " filtrar " para terminar así:

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

Ahora mismo tengo esto, usando jQuery para crear mi leyenda ... pero, por supuesto, está activando 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 únicos de nombre / valor en el objeto JSON completo, para un par dado?

¿Fue útil?

Solución

Me gustaría transformar la matriz de marcadores en un par de valores clave y luego hacer un bucle con las propiedades de los objetos.

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 desea utilizar el primer valor, tendrá que realizar una comprobación condicional para ver si existe la clave.

Otros consejos

¿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 de este tipo devolvería todos los valores distintos que especifique, sino que también los agrupará si necesita acceder a ellos.

En tu muestra usarías:

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

}

Mira esto- La mejor manera de consultar ¿Desea valores de atributos únicos en una matriz de objetos javascript?

Solo necesita una variación que verifique 2 valores en lugar de 1.

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

referencia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top