Как я могу “отфильтровать” JSON для уникальных пар имя ключа / значение?
-
03-07-2019 - |
Вопрос
У меня есть некоторые данные 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 );
}));