json - Dart - 按 json 值过滤数组
问题描述
我有这个 JSON 响应:
{
"suggestions": [
{
"label": "United States, <b>New York</b>",
"language": "en",
"countryCode": "USA",
"locationId": "NT_rNsDLtnazM.kjVC-K6YWOA",
"address": {
"country": "United States",
"state": "<b>New York</b>"
},
"matchLevel": "state"
},
{
"label": "United States, <b>New York</b>, <b>New York</b>, <b>New York</b>",
"language": "en",
"countryCode": "USA",
"locationId": "NT_YpQcXqbaOb.I4m5EW8BHEC",
"address": {
"country": "United States",
"state": "<b>New York</b>",
"county": "<b>New York</b>",
"city": "<b>New York</b>",
"postalCode": "10007"
},
"matchLevel": "city"
},
{
"label": "United States, <b>New York</b>, <b>New York</b>",
"language": "en",
"countryCode": "USA",
"locationId": "NT_ABhedB4xGEL83YY5az47iD",
"address": {
"country": "United States",
"state": "<b>New York</b>",
"county": "<b>New York</b>"
},
"matchLevel": "county"
},
{
"label": "United Kingdom, NE27 0, North Shields, <b>New York</b> Way",
"language": "en",
"countryCode": "GBR",
"locationId": "NT_B24AwYSzW4TK04x9UiKMoD",
"address": {
"country": "United Kingdom",
"state": "England",
"county": "Tyne and Wear",
"city": "North Shields",
"district": "North Shields",
"street": "<b>New York</b> Way",
"postalCode": "NE27 0"
},
"matchLevel": "street"
},
{
"label": "United States, <b>New York</b>, Buffalo, <b>New York</b> State Thruway",
"language": "en",
"countryCode": "USA",
"locationId": "NT_-WyF-KGZ-pqF8zQV6NegHD",
"address": {
"country": "United States",
"state": "<b>New York</b>",
"county": "Erie",
"city": "Buffalo",
"district": "Grant Ferry",
"street": "<b>New York</b> State Thruway",
"postalCode": "14213"
},
"matchLevel": "street"
}
]
}
在代码中,我只想显示matchLevel
类型为city
.
到目前为止,我一直在尝试这个,但它不起作用。我在这里做错了什么?
var data = json.decode(res.body);
var rest = data["suggestions"] as List;
var filteredList;
rest.forEach((val) => filteredList.add(rest.where((val) => val["matchLevel"] == "city")));
print(filteredList);
this.list =
filteredList.map<Suggestions>((json) => Suggestions.fromJson(json)).toList();
也试过这个:
解决方案
改变这个:
var data = json.decode(res.body);
var rest = data["suggestions"] as List;
var filteredList;
rest.forEach((val) => filteredList.add(rest.where((val) => val["matchLevel"] == "city")));
print(filteredList);
进入这个:
var data = json.decode(res.body);
var rest = data["suggestions"] as List;
var filteredList;
filteredList = rest.where((val) => val["matchLevel"] == "city");
print(filteredList);
从文档:
此方法返回映射元素的视图。只要返回
Iterable
的不是迭代,提供的函数 test 就不会被调用。迭代不会缓存结果,因此对返回的结果进行多次迭代Iterable
可能会在同一个元素上多次调用提供的函数测试。
因此,当您使用时forEach()
,where()
您将多次获得相同的结果。
推荐阅读
- django - Django - “图像”属性没有与之关联的文件
- python - 在不专注的情况下不断按时间按键?
- jquery - 如何从发送 JSON 数据的 AJAX 调用访问数据?
- objective-c - 为什么即使文件在桥中,我也无法访问 Objective-C 方法?
- cassandra - 使用 cassandra 社区测试 DSbulk
- c# - .NET MVC 显示变量值
- mysql - 如何使用 MySQL 查询获取年龄小于 50 岁的女性候选人的记录总和
- database - 如何使用 PostgresSQL 进行多项选择
- javascript - 删除一行后更新动态创建的JS html表
- node.js - Node Unzipper - 如何知道它已经完成