我有一些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对象中的唯一名称/值对?
答案 0 :(得分:7)
我将标记数组转换为键值对,然后循环该对象属性。
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');
}
此代码示例使用循环中的最后一个值覆盖唯一值。如果您想使用第一个值,则必须执行一些条件检查以查看密钥是否存在。
答案 1 :(得分:2)
更通用的东西怎么样?
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');
}
答案 2 :(得分:0)
看到这个 - Best way to query back unique attribute values in a javascript array of objects?
您只需要一个检查2个值而不是1个值的变体。
答案 3 :(得分:0)
var markers = _.uniq( _.collect( markers , function( x ){
return JSON.stringify( x );
}));