0

I have this object below that I receive via API, but sometimes the SimplesNacional property comes as null. How do I destructure(??) it only when it's not null, since it has some nested properties that break my program in the destructuration?

This is the object:

const {
    Retorno: {
        ReceitaPJ: {
            NumeroInscricao: numeroInscricao,
            Matriz: matriz,
            DataAbertura: dataAbertura,
            NomeEmpresarial: nomeEmpresarial,
            NomeFantasia: nomeFantasia,
            NaturezaJuridica: naturezaJuridica,
            SituacaoCadastral: situacaoCadastral,
        },
        SimplesNacional: {
            SituacaoSimplesNacional: situacaoSimplesNacional,
            SituacaoSIMEI: situacaoSIMEI,
            SimplesNacionalPeriodosAnteriores: simplesNacionalPeriodosAnteriores,
            SIMEIPeriodosAnteriores,
            DataConsulta: dataConsulta,
        },
        CadastroPJ: {
            Telefones: telefones,
            Enderecos: enderecos,
            Emails: emails,
            Socios: socios,
        },
    },
} = response;

This is the usage:

result.data = {
    cadastroPJ: {
        numeroInscricao,
        matriz,
        dataAbertura,
        nomeEmpresarial,
        nomeFantasia,
        naturezaJuridica,
        situacaoCadastral,
    },
    simplesNacional: {
        nomeEmpresarial,
        situacaoSimplesNacional,
        situacaoSIMEI,
        simplesNacionalPeriodosAnteriores,
        SIMEIPeriodosAnteriores,
        dataConsulta,
    },
    telefones: telefones.map((x) => ({
        numero: x.TelefoneComDDD,
    })),
    enderecos: enderecos.map((x) => ({
        logradouro: x.Logradouro,
        numero: x.Numero,
        bairro: x.Bairro,
        cidade: x.Cidade,
        uf: x.UF,
        cep: x.CEP,
    })),
    emails: emails.map((x) => ({
        endereco: x.EnderecoEmail,
    })),
    socios: socios.map((x) => ({
        documento: x.Documento,
        nome: x.Nome,
        percentualParticipacao: x.PercentualParticipacao,
        dataEntrada: x.DataEntrada,
    })),
};

Visual Studio Code terminal says:

Cannot destructure property SituacaoSimplesNacional of undefined or null.

because the property SimplesNacional is null.

Alex
  • 1,457
  • 1
  • 13
  • 26
innis
  • 370
  • 1
  • 3
  • 14
  • 1
    Did you mean "response" is the "result" in second snippet? also can you check if this answers your question? https://stackoverflow.com/questions/59425002/how-to-properly-destructure-variable-if-it-can-be-absent-inside-property/59425726#59425726 – Siva K V Dec 30 '19 at 16:52
  • Yep, result is the response properties treated to a new object. – innis Dec 30 '19 at 16:54
  • 1
    Is the property there with a null value, or omitted completely? The solution is different for the two cases. – Barmar Dec 30 '19 at 17:07
  • @Barmar the property is there with a null value. – innis Dec 30 '19 at 17:11
  • Your destructuring pattern is very different from the object. There's no `CadastroPJ` property in the `result.data` object. There's no `Retorno` property, either. – Barmar Dec 30 '19 at 17:12

1 Answers1

1
const {
  Retorno: {
    ReceitaPJ: {
      NumeroInscricao: numeroInscricao,
      Matriz: matriz,
      DataAbertura: dataAbertura,
      NomeEmpresarial: nomeEmpresarial,
      NomeFantasia: nomeFantasia,
      NaturezaJuridica: naturezaJuridica,
      SituacaoCadastral: situacaoCadastral,
    },
    SimplesNacional,
    CadastroPJ: {
      Telefones: telefones,
      Enderecos: enderecos,
      Emails: emails,
      Socios: socios,
    },
  },
} = response

if (SimplesNacional) {
  var {
    SituacaoSimplesNacional: situacaoSimplesNacional,
    SituacaoSIMEI: situacaoSIMEI,
    SimplesNacionalPeriodosAnteriores: simplesNacionalPeriodosAnteriores,
    SIMEIPeriodosAnteriores,
    DataConsulta: dataConsulta,
  } = SimplesNacional
}

Just make it in two steps

EDIT: if you want use const...

const {
   SituacaoSimplesNacional: situacaoSimplesNacional,
   SituacaoSIMEI: situacaoSIMEI,
   SimplesNacionalPeriodosAnteriores: simplesNacionalPeriodosAnteriores,
   SIMEIPeriodosAnteriores,
   DataConsulta: dataConsulta,
 } = (SimplesNacional || {})

but anyway, deep in object will throw an error later...

Eliseo
  • 604
  • 4
  • 10
  • This doesn't work with `const` though – Bergi Dec 30 '19 at 17:14
  • This works, but it doesn't look right. I'm gonna use it like this because I'm short in time, but eventually I'm gonna sit down and make more research on this. Thanks – innis Dec 30 '19 at 17:57
  • 1
    Keep it simple, prioritize maintainability, forget about tricks and quick solves, the next dev will be grateful <3 – Eliseo Dec 31 '19 at 19:04