如何“过滤”JSON 以获得唯一的键名/值对?
Posted
技术标签:
【中文标题】如何“过滤”JSON 以获得唯一的键名/值对?【英文标题】:How can I "filter" JSON for unique key name/value pairs? 【发布时间】:2010-10-10 22:26:16 【问题描述】:我有一些 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 对象中唯一的名称/值对?
【问题讨论】:
【参考方案1】:我会将标记数组转换为键值对,然后循环该对象的属性。
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');
此代码示例用循环中的最后一个值覆盖唯一值。如果您想使用第一个值,则必须执行一些条件检查以查看该键是否存在。
【讨论】:
我向你的 jQuery-fu 鞠躬。谢谢! 我不是在拖钓,但这更像是 JS-fu :) 发现这在调试过程中对 JSON 数据进行原始评估时非常有用。谢谢!【参考方案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');
【讨论】:
【参考方案3】:看到这个- Best way to query back unique attribute values in a javascript array of objects?
您只需要一个检查 2 个值而不是 1 个值的变体。
【讨论】:
感谢您的链接——我的搜索能力确实很弱。 :)【参考方案4】:var markers = _.uniq( _.collect( markers , function( x )
return JSON.stringify( x );
));
reference
【讨论】:
以上是关于如何“过滤”JSON 以获得唯一的键名/值对?的主要内容,如果未能解决你的问题,请参考以下文章