Как я могу “отфильтровать” JSON для уникальных пар имя ключа / значение?

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

Вопрос

У меня есть некоторые данные JSON, которые дают мне список языков с такой информацией, как lat / lng и т.д.Он также содержит значение группы, которое я использую для значков, и я хочу создать легенду с его помощью.JSON выглядит примерно так:

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

И я хочу "отфильтровать" его, чтобы в итоге получилось вот так:

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

Прямо сейчас у меня есть это, я использую jQuery для создания своей легенды .. но, конечно, он использует все значения:

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

Как я могу получить только уникальные пары имя / значение во всем объекте JSON для данной пары?

Это было полезно?

Решение

Я бы преобразовал массив маркеров в пару ключ-значение, а затем зациклил эти свойства объектов.

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

тогда

$.each(uniqueGroups, function(g) {
  $('<p>').html('<img src="http://mysite/group' + g + '.png\" />' + this).appendTo('#legend-contents');
});

или

for(var g in uniqueGroups)
{
  $('<p>').html('<img src="http://mysite/group' + g + '.png\" />' + uniqueGroups[g]).appendTo('#legend-contents');
}

Этот пример кода перезаписывает уникальное значение последним значением в цикле.Если вы хотите использовать вместо этого первое значение, вам придется выполнить некоторую условную проверку, чтобы убедиться, существует ли ключ.

Другие советы

Как насчет чего-нибудь более общего?

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.
}

Такая функция не только вернет все указанные вами различные значения, но и сгруппирует их, если вам потребуется получить к ним доступ.

В вашем примере вы бы использовали:

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

}

Видишь это- Лучший способ запросить обратно уникальные значения атрибутов в массиве объектов javascript?

Вам просто нужен вариант, который проверяет наличие 2 значений, а не 1.

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

ссылка

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top