如何“过滤”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 以获得唯一的键名/值对?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jq 保留键名展平 JSON

JSON对象的编组切片的键名需要小写[重复]

PHP 根据配置转换数组中的键名 方便给前端的时候改键名

使用数组更改 JSON 的键名

php 中已知数组的键名,怎么获得键值?

localStorage