Open2
Mapのネストした値を取り出す。

フィルタリングをやってみる
ネストした値を取り出したい。
void main() {
// ネストしたオブジェクト
Map<String, dynamic> account = {
'name': 'Mike',
'age': 25,
'expenses': {
'food': 100,
'rent': 300,
'insurance': 200,
},
'income': 1000,
};
Map<String, int> searchFilter(Map<String, dynamic> account, String key, int minValue) {
// expensesオブジェクトをMapからListに変換
List<MapEntry<String, int>> expensesArray = (account['expenses'] as Map<String, int>).entries.toList();
// filterを1回だけ使用して、指定した条件に一致する項目を抽出
List<MapEntry<String, int>> result = expensesArray
.where((entry) => entry.key == key && entry.value > minValue)
.toList();
// 結果をMapに戻す
Map<String, int> filteredExpenses = Map.fromEntries(result);
return filteredExpenses;
}
// searchFilter関数を使用してフィルタリング
Map<String, int> filteredExpenses = searchFilter(account, 'rent', 200);
print(filteredExpenses); // {rent: 300}
}

loopと組み合わせる
index番目から取得する。
void main() {
// Map型のpersonを定義
Map<String, dynamic> person = {
'name': 'Alice',
'age': 25,
'isStudent': false,
'likeFood': [
{
'name': 'apple',
'calorie': 52,
},
{
'name': 'banana',
'calorie': 89,
},
{
'name': 'orange',
'calorie': 47,
},
],
'place': {
'country': 'Japan',
'city': 'Tokyo',
},
'country': [
{'ja': '日本'},
{'en': 'アメリカ'},
{'fr': 'フランス'},
{'de': 'ドイツ'},
],
};
// personのlikeFoodリストを出力
List<String> searchProfile(Map<String, dynamic> person, String value) {
// likeFoodリストを取得
List<Map<String, dynamic>> likeFood = List<Map<String, dynamic>>.from(person['likeFood']);
// whereメソッドで、valueが一致するものを抽出
List<String> result = likeFood
.where((element) => element['name'] == value)
.map((element) => element['name'] as String)
.toList();
// 結果を返す
return result;
}
// 国名から人物を検索
// place key の中に country key がある場合、その値を取得
String searchCountry(Map<String, dynamic> person, String country) {
// countryが一致するかどうかを判定
if (person['place']['country'] == country) {
return person['name'];
} else {
return 'Not Found';
}
}
// country key の中に ja key がある場合、その値を取得
// indexで取得
String countryFiltter(Map<String, dynamic> person, String country) {
// countryが一致するかどうかを判定
for (var i = 0; i < person['country'].length; i++) {
if (person['country'][i]['ja'] == country) {
return person['name'];
}
}
return 'Not Found';
}
// 検索結果を表示
List<String> result = searchProfile(person, 'banana');
print(result); // ['banana']
String result2 = searchCountry(person, 'Japan');
print(result2); // Alice
String result3 = countryFiltter(person, '日本');
print(result3); // Alice
}