Sobes.tech
Junior

Kuidas võrrelda objekte JavaScriptis?

sobes.tech AI

Vastus AI-lt

JavaScriptis otsene võrdlus === või == kontrollib viidete identiivsust, mitte nende sisu võrdlust. Objekti sisu võrdlemiseks on järgmised lähenemised:

  • Lame võrdlus:

    • Kontrollib, kas esimesel tasemel võtmed ja väärtused kattuvad.
    • Kasutatakse "lame" objektide puhul, kus pole sisemisi objekte või massiive.
    • Võib käsitsi rakendada, läbides võtmeid või kasutades Object.keys() ja every().
    // Näide lame võrdluse
    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;
    };
    
  • Sügav võrdlus:

    • Rekursiivselt kontrollib kõiki sisemisi objekte ja massiive.
    • Vajalik keerukate andmestruktuuride õige võrdlemise jaoks.
    • Võib kasutada rekursiooni või iteratiivset lähenemist steki kasutades.
    • Nõuab erinevate andmetüüpide (primitivid, objektid, massiivid, kuupäevad, regulaaravaldised) töötlemist.
  • Võrdlus JSON.stringify() kasutades:

    • Muudab objektid JSON-stringideks ja võrdleb neid.
    • Lihtne meetod, kuid omab piiranguid:
      • Ei arvesta võtmete järjekorda objektides.
      • Ei tööta funktsioonide, undefined, NaN, Infinity puhul.
      • Võib olla ebaefektiivne väga suurte objektide puhul.
    // Näide võrdlusest `JSON.stringify()` abil
    const areEqualJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Kolmanda osapoole teekide kasutamine:

    • Teegid nagu lodash (funktsioon _.isEqual) või deep-equal pakuvad usaldusväärseid ja optimeeritud süva võrdluse rakendusi, arvestades paljusid nüansse (tsüklilised viited, erinevad tüübid, äärejuhtumid).

Valik sõltub vajalikust täpsusest ja võrdluses olevate objektide keerukusest. Lihtsate juhtumite puhul piisab lamevõrdlusest või JSON.stringify()-st. Keerukamate struktuuride puhul on soovitatav kasutada süva võrdlust või valmis teeke.