【问题标题】:Function to find check non-null form control values recursively in a FormGroup在 FormGroup 中递归查找检查非空表单控件值的函数
【发布时间】:2026-01-05 21:15:02
【问题描述】:

我想创建一个函数来检查FormGroup 中是否至少有一个非空值,它可以由任何类型的AbstractControl 组成(FormControlFormArrayFormGroup) .默认情况下,所有值都设置为null。我遇到了一个函数,可以递归地计算 FormGroup 中的所有 FormControl

const countControls = (control: AbstractControl): number => {
  if (control instanceof FormControl) {
    return 1;
  }

  if (control instanceof FormArray) {
    return control.controls.reduce((acc, curr) => acc + countControls(curr), 1)
  }

  if (control instanceof FormGroup) {
    return Object.keys(control.controls)
      .map(key => control.controls[key])
      .reduce((acc, curr) => acc + countControls(curr), 1);
  }
}

StackBlitz

我无法为我的用例(即 checkNonNull)转换这个函数,它会返回一个布尔值。至少一个非空值为真,否则为假。

【问题讨论】:

    标签: angular angular-reactive-forms formgroups


    【解决方案1】:

    这个怎么样?相同的过程,但查找具有值的表单控件并返回 true(如果有)。

    const checkNonNull = (control: AbstractControl): boolean => {
      if (control instanceof FormControl) {
        return control.value ? true : false;
      }
    
      if (control instanceof FormArray) {
        return control.controls.some((ctrl) => checkNonNull(ctrl));
      }
    
      if (control instanceof FormGroup) {
        return Object.keys(control.controls)
          .map((key) => checkNonNull(control.controls[key])).some(result => result == true);
      }
    };
    

    【讨论】: