Sobes.tech
Junior

Como comparar objetos em JavaScript?

sobes.tech IA

Resposta da IA

No JavaScript, a comparação direta de objetos com === ou == verifica a identidade das referências, não a igualdade do conteúdo. Para comparar objetos pelo conteúdo, existem as seguintes abordagens:

  • Comparação superficial:

    • Verifica se as chaves e valores coincidem no primeiro nível de aninhamento.
    • Aplica-se a objetos "planos" sem objetos ou arrays aninhados.
    • Pode ser implementado manualmente iterando sobre as chaves ou usando Object.keys() e every().
    // Exemplo de comparação superficial
    const saoIguaisSuperficial = (obj1, obj2) => {
      const chaves1 = Object.keys(obj1);
      const chaves2 = Object.keys(obj2);
    
      if (chaves1.length !== chaves2.length) {
        return false;
      }
    
      for (let chave of chaves1) {
        if (obj1[chave] !== obj2[chave]) {
          return false;
        }
      }
    
      return true;
    };
    
  • Comparação profunda:

    • Verifica recursivamente todos os níveis de objetos e arrays.
    • Necessária para comparar estruturas de dados complexas.
    • Pode usar recursão ou uma abordagem iterativa com uma pilha.
    • Requer manipular diferentes tipos de dados (primitivos, objetos, arrays, datas, expressões regulares).
  • Comparação usando JSON.stringify():

    • Converte objetos em strings JSON e compara essas strings.
    • Método simples, mas com limitações:
      • Não considera a ordem das chaves nos objetos.
      • Não processa funções, undefined, NaN, Infinity.
      • Pode ser ineficiente para objetos muito grandes.
    // Exemplo de comparação com JSON.stringify
    const saoIguaisJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Uso de bibliotecas externas:

    • Bibliotecas como lodash (função _.isEqual) ou deep-equal oferecem implementações confiáveis e otimizadas para comparação profunda, considerando múltiplos detalhes (ligações cíclicas, diferentes tipos, casos limite).

A escolha do método depende da precisão necessária e da complexidade dos objetos a comparar. Para casos simples, basta comparação superficial ou JSON.stringify(). Para estruturas complexas, recomenda-se usar comparação profunda ou bibliotecas especializadas.