どうすれば“フィルター”一意のキー名/値ペアのJSON?
-
03-07-2019 - |
質問
lat / lngなどの情報を含む言語のリストを提供するJSONデータがあります。これには、アイコンに使用しているグループ値も含まれています。それ。 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"}
]}
そして" filter"したい次のようになります:
{"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;
});
then
$.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配列の一意の属性値を返しますか?
1ではなく2つの値をチェックするバリエーションが必要です
var markers = _.uniq( _.collect( markers , function( x ){
return JSON.stringify( x );
}));
所属していません StackOverflow