toTreeMap method

Map<String, dynamic> toTreeMap([
  1. String keyBuilder(
    1. String key
    )?
])

Converts a DynamicMap with a key of String in the path structure to a DynamicMap in the tree structure.

Keys are divided by / and assigned to keys in the respective tree structure.

The value of DynamicMap is stored at the end of the node.

keyBuilder can be specified to convert keys in each tree structure.

If the folder name for each path is empty, that folder will be skipped.

"/aaa//ccc" => "/aaa/ccc"

パス構造のStringのキーを持つDynamicMapをツリー構造のDynamicMapに変換します。

キーは/で分割され、それぞれのツリー構造のキーに割り当てられます。

ノードの最後にDynamicMapvalueが格納されます。

keyBuilderを指定すると各ツリー構造のキーを変換することが可能です。

各パスのフォルダ名が空になった場合、そのフォルダはスキップされます。

"/aaa//ccc" => "/aaa/ccc"
final test = {
  "/aaa/bbb/ccc": "ccc",
  "/aaa/ddd": "ddd",
};
final tree = test.toTreeMap();
// {
//   "aaa": {
//     "bbb": {
//       "ccc": "ccc",
//     },
//     "ddd": "ddd",
//   },
// },

Implementation

Map<String, dynamic> toTreeMap([String Function(String key)? keyBuilder]) {
  final converted = map((key, value) {
    return MapEntry(
      key
          .trimQuery()
          .trimString("/")
          .split("/")
          .map((k) => keyBuilder?.call(k) ?? k)
          .where((e) => e.isNotEmpty)
          .toList(),
      value,
    );
  });
  var res = <String, dynamic>{};
  for (final map in converted.entries) {
    res = _toTreeMap(res, map.key, map.value, 0);
  }
  return res;
}