Sobes.tech
Junior

Ako porovnať objekty v JavaScripte?

sobes.tech AI

Odpoveď od AI

V JavaScripte priame porovnanie objektov === alebo == kontroluje identitu odkazov, nie rovnosť ich obsahu. Na porovnanie objektov podľa obsahu existujú nasledujúce prístupy:

  • Povrchové porovnanie:

    • Kontroluje, či sa zhodujú kľúče a hodnoty na prvej úrovni vnorenia.
    • Používa sa pre "povrchové" objekty bez vnorených objektov alebo polí.
    • Môže byť implementované manuálne iterovaním cez kľúče alebo použitím Object.keys() a every().
    // Príklad povrchového porovnania
    const areEqualShallow = (obj1, obj2) => {
      const keys1 = Object.keys(obj1);
      const keys2 = Object.keys(obj2);
    
      if (keys1.length !== keys2.length) {
        return false;
      }
    
      for (let key of keys1) {
        if (obj1[key] !== obj2[key]) {
          return false;
        }
      }
    
      return true;
    };
    
  • Hlboké porovnanie:

    • Rekurzívne kontroluje všetky úrovne vnorovania objektov a polí.
    • Je potrebné pre správne porovnanie zložitých dátových štruktúr.
    • Môže použiť rekurziu alebo iteratívny prístup s použitím zásobníka.
    • Vyžaduje spracovanie rôznych typov dát (primitívy, objekty, polia, dátumy, regulárne výrazy).
  • Porovnanie pomocou JSON.stringify():

    • Premení objekty na JSON reťazce a porovnáva tieto reťazce.
    • Jednoduchý spôsob, ale má obmedzenia:
      • Nezohľadňuje poradie kľúčov v objektoch.
      • Nespracováva funkcie, undefined, NaN, Infinity.
      • Môže byť neefektívne pre veľmi veľké objekty.
    // Príklad porovnania cez JSON.stringify
    const areEqualJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Použitie knižníc tretích strán:

    • Knižnice ako lodash (funkcia _.isEqual) alebo deep-equal poskytujú spoľahlivé a optimalizované implementácie hlbokého porovnania s ohľadom na množstvo nuansov (cyklické odkazy, rôzne typy, okrajové prípady).

Výber metódy závisí od požadovanej presnosti porovnania a zložitosti porovnávaných objektov. Pre jednoduché prípady stačí povrchové porovnanie alebo JSON.stringify(). Pre zložité štruktúry sa odporúča použiť hlboké porovnanie alebo hotové knižnice.