How can I decrease the level of complexity of this function?

Asked

Viewed 87 times

1

I’m learning development Web with HTML, CSS and Javascript and I came across the problem of generating a phone number with parentheses, dash and space. As I’m starting I developed a code that returns me good results, but does not pass the level of complexity of Codeclimate. Can anyone help me? I am very grateful for the help?

function generatePhoneNumber(vetor) {
  let countRepeat = vetor.filter((e, i, a) => a.indexOf(e) !== i);
  countRepeat.sort(function (a, b) { return a - b; });
  let contagemReal = 0;
  let confere = 0;
  for (let i = 0; i < countRepeat.length; i += 1) {
    if (countRepeat[i] === countRepeat[i + 1] || countRepeat[i] === 
    countRepeat[i + 2]) {
    contagemReal = 3;
    }
  }
  for (let i in vetor) {
    if (vetor[i] > 9 || vetor[i] < 0) {
      confere += 1;
    }
  }
  if (vetor.length !== 11) {
    return 'Array com tamanho incorreto.';
  } else if (contagemReal >= 3 || confere !== 0) {
    return 'não é possível gerar um número de telefone com esses valores';
}
  vetor.splice(0, 0, '(');
  vetor.splice(3, 0, ')');
  vetor.splice(4, 0, ' ');
  vetor.splice(10, 0, '-');
  return vetor.join('');
}

1 answer

0

welcome to the Stackoverflow.

A simple solution to this would be the use of regular expressions to identify the groups that form the phone number: ddd, first and second parts. For example (11) 23451-9321 we have

  1. DDD: 11
  2. First part: 23451
  3. Second part: 9321

From there you can create the regular expression that separates the three groups and already make the substitution.

    /*criando a expressão regular:
        Essa expressão tem 3 partes
        1) (\d{2}) - Esta representa o ddd ou seja 2 números seguidos. \d representa um dígito. {2} significa exatamente dois elementos que o precedem. Com isso, podemos identificar dois dígitos '11' no nosso exemplo
        2) (\d{5}) - A primeira parte, formada por exatamente 5 dígitos
        3) (\d{4}) - A segunda parte, por 4 dígitos
    */
    er = new RegExp(/(\d{2})(\d{5})(\d{4})/g);
    let telefone = "11234519321";
    //para formatar o telefone, utilize o método replace da string, passando a string com o formato desejado:
    //note que temos $1, $2 e $3, que são as referências dos grupos formados na er acima e que são definidos pelos parentesis '(' e ')' que indicam o inicio e o final de cada grupo
    let resultado = telefone.replace(er, "($1) $2-$3")
    console.log(resultado); //vai mostrar (11) 23451-9321

More about regular expressions here:

MDN

Tester de Er online

Browser other questions tagged

You are not signed in. Login or sign up in order to post.