groupBy method

List<Map> groupBy(
  1. String key, {
  2. String? setKeyAs,
  3. dynamic wrapWith(
    1. dynamic
    )?,
  4. List<String> addKeys = const [],
})
List<Map> group = data.groupBy('gender', wrapWith: (data){
  return [...data.map((e) => YourModel.fromJson(e))];
}, addKeys: ['gender']);

Implementation

List<Map<dynamic, dynamic>> groupBy(String key,
    {String? setKeyAs,
    Function(dynamic)? wrapWith,
    List<String> addKeys = const []}) {
  try {
    List<Map<dynamic, dynamic>> result = [];
    List keys = [];

    for (Map f in this) {
      keys.add(f[key]);

      if (!f.keys.toList().contains(key)) {
        return this;
      }
    }

    for (var k in [...keys.toSet()]) {
      List data = [...where((e) => e[key] == k)];
      Map map = {};

      if (addKeys.isNotEmpty) {
        for (var k in addKeys) {
          map[k] = data.first[k];
        }
      }

      if (wrapWith != null) {
        data = wrapWith(data);
      }

      if (setKeyAs != null) map['group_by'] = k;

      //remove key (group_by)
      //data.forEach((w) => w.removeWhere((k, v) => k == key));
      map[setKeyAs ?? k] = data;

      result.add(map);
    }

    return result;
  } catch (e) {
    throw Exception('$e');
  }
}