Как эффективно извлечь карту из карты в дартс? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть карта, возвращенная из json .decode типа Map<String,dynamic>

Динамическая c часть содержит другую карту, которую я хочу иметь в отдельной переменной. Мне удалось сделать это следующим образом:

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, я получаю ошибку

1 Ответ

0 голосов
/ 25 апреля 2020

Работать с 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));

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...