Filtering keeps values that match a rule and drops the rest before the next stage.

Program

Play the program to keep names whose score reaches the selected minimum.

minScore
filter_scores.dart
Replay: real traced execution (multi-file project)
void main() {
  var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};
  var minScore = 80;
  var passed = <String>[];
  for (var entry in scores.entries) {
    if (entry.value >= minScore) {
      passed.add(entry.key);
    }
  }
  print('passed=${passed.join(",")}');
}
void main() {
  var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};
  var minScore = 90;
  var passed = <String>[];
  for (var entry in scores.entries) {
    if (entry.value >= minScore) {
      passed.add(entry.key);
    }
  }
  print('passed=${passed.join(",")}');
}
  1. scores ← {Ada: 92, Linus: 78, Grace: 86}

    1void main() {2  var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};3  var minScore = 80;
    values this step{Ada: 92, Linus: 78, Grace: 86}scores
  2. minScore ← 80

    2var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};3var minScore = 80;4var passed = <String>[];
    values this step80minScore
  3. passed ← []

    3var minScore = 80;4var passed = <String>[];5for (var entry in scores.entries) {
    values this step[]passed
  4. entry ← Ada=92

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepAda=92entry
  5. keep ← true

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this steptruekeep92entry.value80minScore
  6. passed ← [Ada]

    6if (entry.value >= minScore) {7  passed.add(entry.key);8}
    values this step[] [Ada]passed
  7. entry ← Linus=78

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepLinus=78entry
  8. keep ← false

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this stepfalsekeep78entry.value80minScore
  9. entry ← Grace=86

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepGrace=86entry
  10. keep ← true

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this steptruekeep86entry.value80minScore
  11. passed ← [Ada, Grace]

    6if (entry.value >= minScore) {7  passed.add(entry.key);8}
    values this step[Ada] [Ada, Grace]passed
  12. print('passed=${passed.join(",")}');

    9  }10  print('passed=${passed.join(",")}');11}
    outputpassed=Ada,Grace
    values this step[Ada, Grace]passed
  1. scores ← {Ada: 92, Linus: 78, Grace: 86}

    1void main() {2  var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};3  var minScore = 90;
    values this step{Ada: 92, Linus: 78, Grace: 86}scores
  2. minScore ← 90

    2var scores = {'Ada': 92, 'Linus': 78, 'Grace': 86};3var minScore = 90;4var passed = <String>[];
    values this step90minScore
  3. passed ← []

    3var minScore = 90;4var passed = <String>[];5for (var entry in scores.entries) {
    values this step[]passed
  4. entry ← Ada=92

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepAda=92entry
  5. keep ← true

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this steptruekeep92entry.value90minScore
  6. passed ← [Ada]

    6if (entry.value >= minScore) {7  passed.add(entry.key);8}
    values this step[] [Ada]passed
  7. entry ← Linus=78

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepLinus=78entry
  8. keep ← false

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this stepfalsekeep78entry.value90minScore
  9. entry ← Grace=86

    4var passed = <String>[];5for (var entry in scores.entries) {6  if (entry.value >= minScore) {
    values this stepGrace=86entry
  10. keep ← false

    5for (var entry in scores.entries) {6  if (entry.value >= minScore) {7    passed.add(entry.key);
    values this stepfalsekeep86entry.value90minScore
  11. print('passed=${passed.join(",")}');

    9  }10  print('passed=${passed.join(",")}');11}
    outputpassed=Ada
    values this step[Ada]passed

Follow the Filter

  1. scores starts as Ada 92, Linus 78, and Grace 86.
  2. minScore starts at 80.
  3. The loop checks each score with entry.value >= minScore.
  4. Ada and Grace pass; Linus does not.
  5. The program prints passed=Ada,Grace. | minScore | Ada 92 | Linus 78 | Grace 86 | output | | ---: | --- | --- | --- | --- | | 80 | keep | drop | keep | passed=Ada,Grace | | 90 | keep | drop | drop | passed=Ada |
entries `scores.entries` visits each key/value pair in a map.
filter The `if` statement decides whether the current entry continues.
join `passed.join(',')` turns the kept names into display text.

Exercise: filter_scores.dart

Reproduce passed=Ada,Grace, then use minScore 90 to predict passed=Ada.