我有一个从Map<String,dynamic>
类型的json.decode返回的映射
动态部分包含另一个映射,我希望将其放在单独的变量中。我设法通过以下方式做到这一点:
Map<DateTime, List<DayOffDto>> mapToReturn = Map();
Map<String, dynamic> responseBody = json.decode(
response.body,
reviver: _reviver,
);
if (responseBody == null) {
throw NoDataServerException();
}
responseBody.entries.forEach((element) {
Map map = element.value;
//map.values;
map.entries.forEach((element2) {
mapToReturn[element2.key] = element2.value;
});
});
//mapToReturn contains now the extracted map from responseBody
reviver函数为我做了一些转换
_reviver(dynamic key, dynamic value) {
if (key != null && value is Map && (key as String).contains("-")) {
var object = value;
final DayOffDto dayOffDto = DayOffDto.fromFirebase(
key_firebase: key as String,
parsedJson: value,
rota: rotaParam,
chosenYear: yearParam);
DateTime datetime = Helper.getDateTimeFromDayNumber(
dayOffDto.dayNumber,
dayOffDto.year,
);
Map<DateTime, List<DayOffDto>> internalMap = LinkedHashMap();
internalMap[datetime] = [dayOffDto];
return internalMap;
}
return value;}
我认为这不是提取的最佳方法。对优化代码有任何想法吗?
responseBody.values
返回Iterable<V>
所以当我这样做
mapToReturn = responseBody.values
我遇到了错误
答案 0 :(得分:0)
使用Map
有时会很困难。我想告诉您,有些事情像mapToReturn = responseBody.values
一样容易,但是到今天为止,还没有(我能找到)。
但是,我可以给您一个小代码块,其功能与您的第一个代码块相同。
由于您没有使用第一张地图的keys
,因此应该使用responseBody.entries
而不是responseBody.values
。所以代码块最终会像这样:
responseBody.values.forEach((value) {
return value is Map<DateTime, List<DayOffDto>>
? mapToReturn.addAll(value)
: null;
});
如果您完全确定值Type
(您应该在使用reviver
的情况下),则只能使其成为一行代码。
responseBody.values.forEach((value) => mapToReturn.addAll(value));
希望这对您有帮助!