Angular - validador de exclusividade no FormArray

Criei um validador personalizado para validar a exclusividade no meuFormArray. Eu quero mostrar erro quando valor (es) específico (s) é / já estão na matriz.

O problema é que não está funcionando como esperado.

Comportamento real:

Passos para reproduzir:

Adicione 3 "entradas" - endereço;Preencha a entrada 1;Preencha a entrada 2 com valor diferente;Preencha a entrada 3 com o mesmo valor da entrada 1; (nenhum erro aparece, nem na entrada 1 nem na entrada 3)

Comportamento esperado:

Se os mesmos valores aparecerem em "grupos X", suas entradas específicas deverão mostrar o erro.

No caso descrito acima, os erros devem aparecer nas entradas 1 e 3.

Supondo que eu tenha 4 entradas:

valor: pilhavalor: estourovalor: pilhavalor: estouro

As 4 entradas devem mostrar um erro, porque todas elas são duplicadas.

static uniqueBy = (field: string, caseSensitive = true): ValidatorFn => {
  return (formArray: FormArray): { [key: string]: boolean } => {
    const controls = formArray.controls.filter(formGroup => {
      return isPresent(formGroup.get(field).value);
    });
    const uniqueObj = { uniqueBy: true };
    let found = false;

    if (controls.length > 1) {
      for (let i = 0; i < controls.length; i++) {
        const formGroup = controls[i];
        const mainControl = formGroup.get(field);
        const val = mainControl.value;    
        const mainValue = caseSensitive ? val.toLowerCase() :  val;

        controls.forEach((group, index) => {
          if (i === index) {
            // Same group
            return;
          }

          const currControl = group.get(field);
          const tempValue = currControl.value;
          const currValue = caseSensitive ? tempValue.toLowerCase() : tempValue;
          let newErrors;

          if ( mainValue === currValue) {
            if (isBlank(currControl.errors)) {
              newErrors = uniqueObj;
            } else {
              newErrors = Object.assign(currControl.errors, uniqueObj);
            }

            found = true;
          } else {
            newErrors = currControl.errors;

            if (isPresent(newErrors)) {
              // delete uniqueBy error
              delete newErrors['uniqueBy'];

              if (isBlank(newErrors)) {
                // {} to undefined/null
                newErrors = null;
              }
            }
          }

          // Add specific errors based on condition
          currControl.setErrors(newErrors);
        });
      }

      if (found) {
        // Set errors to whole formArray
        return uniqueObj;
      }
    }

    // Clean errors
    return null;
  };
}

Você pode checar aquiDEMO.

questionAnswers(2)

yourAnswerToTheQuestion