Grouping accumulates records under a shared key.

Program

Play the program to count orders by region, optionally filtering to open orders.

statusFilter
group_regions.dart
Replay: real traced execution (multi-file project)
void main() {
  var orders = [
    {'region': 'east', 'status': 'open'},
    {'region': 'west', 'status': 'open'},
    {'region': 'west', 'status': 'closed'},
  ];
  var statusFilter = 'all';
  var counts = <String, int>{};
  for (var order in orders) {
    if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    var region = order['region']!;
    counts[region] = (counts[region] ?? 0) + 1;
  }
  print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(";")}');
}
void main() {
  var orders = [
    {'region': 'east', 'status': 'open'},
    {'region': 'west', 'status': 'open'},
    {'region': 'west', 'status': 'closed'},
  ];
  var statusFilter = 'open';
  var counts = <String, int>{};
  for (var order in orders) {
    if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    var region = order['region']!;
    counts[region] = (counts[region] ?? 0) + 1;
  }
  print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(";")}');
}
  1. statusFilter ← all

    6];7var statusFilter = 'all';8var counts = <String, int>{};
    values this stepallstatusFilter
  2. counts ← {}

    7var statusFilter = 'all';8var counts = <String, int>{};9for (var order in orders) {
    values this step{}counts
  3. order ← east/open

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepeast/openorder
  4. region ← east

    10if (statusFilter != 'all' && order['status'] != statusFilter) continue;11var region = order['region']!;12counts[region] = (counts[region] ?? 0) + 1;
    values this stepeastregion
  5. counts ← {east: 1}

    11  var region = order['region']!;12  counts[region] = (counts[region] ?? 0) + 1;13}
    values this step{east: 1}counts
  6. order ← west/open

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepwest/openorder
  7. region ← west

    10if (statusFilter != 'all' && order['status'] != statusFilter) continue;11var region = order['region']!;12counts[region] = (counts[region] ?? 0) + 1;
    values this stepwestregion
  8. counts ← {east: 1, west: 1}

    11  var region = order['region']!;12  counts[region] = (counts[region] ?? 0) + 1;13}
    values this step{east: 1, west: 1}counts
  9. order ← west/closed

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepwest/closedorder
  10. region ← west

    10if (statusFilter != 'all' && order['status'] != statusFilter) continue;11var region = order['region']!;12counts[region] = (counts[region] ?? 0) + 1;
    values this stepwestregion
  11. counts ← {east: 1, west: 2}

    11  var region = order['region']!;12  counts[region] = (counts[region] ?? 0) + 1;13}
    values this step{east: 1, west: 2}counts
  12. print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(…

    13  }14  print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(";")}');15}
    outputcounts=east=1;west=2
    values this step{east: 1, west: 2}counts
  1. statusFilter ← open

    6];7var statusFilter = 'open';8var counts = <String, int>{};
    values this stepopenstatusFilter
  2. counts ← {}

    7var statusFilter = 'open';8var counts = <String, int>{};9for (var order in orders) {
    values this step{}counts
  3. order ← east/open

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepeast/openorder
  4. region ← east

    10if (statusFilter != 'all' && order['status'] != statusFilter) continue;11var region = order['region']!;12counts[region] = (counts[region] ?? 0) + 1;
    values this stepeastregion
  5. counts ← {east: 1}

    11  var region = order['region']!;12  counts[region] = (counts[region] ?? 0) + 1;13}
    values this step{east: 1}counts
  6. order ← west/open

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepwest/openorder
  7. region ← west

    10if (statusFilter != 'all' && order['status'] != statusFilter) continue;11var region = order['region']!;12counts[region] = (counts[region] ?? 0) + 1;
    values this stepwestregion
  8. counts ← {east: 1, west: 1}

    11  var region = order['region']!;12  counts[region] = (counts[region] ?? 0) + 1;13}
    values this step{east: 1, west: 1}counts
  9. order ← west/closed

    8var counts = <String, int>{};9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;
    values this stepwest/closedorder
  10. skip ← true

    9for (var order in orders) {10  if (statusFilter != 'all' && order['status'] != statusFilter) continue;11  var region = order['region']!;
    values this steptrueskipopenstatusFilterclosedorder.status
  11. print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(…

    13  }14  print('counts=${counts.entries.map((e) => '${e.key}=${e.value}').join(";")}');15}
    outputcounts=east=1;west=1
    values this step{east: 1, west: 1}counts
map literal `<String, int>{}` creates a typed empty map.
null fallback `counts[region] ?? 0` supplies zero for a new group.
entries.map Mapping entries creates display strings for each group.