Как я могу "отфильтровать" JSON для уникальных пар имя / значение ключа? - PullRequest
5 голосов
/ 03 марта 2009

У меня есть некоторые данные 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 для данной пары?

Ответы [ 4 ]

7 голосов
/ 03 марта 2009

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

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

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

2 голосов
/ 03 марта 2009

Как насчет чего-то более общего?

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

}
0 голосов
/ 17 сентября 2014
var markers  = _.uniq( _.collect( markers , function( x ){
                        return JSON.stringify( x ); 
                    })); 

ссылка

0 голосов
/ 03 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...