Sobes.tech
Junior

Kaip palyginti objektus JavaScript?

sobes.tech AI

Atsakymas iš AI

JavaScript tiesioginis palyginimas === arba == tikrina nuorodų identiškumą, o ne jų turinio lygybę. Objektų turinio palyginimui yra šie požiūriai:

  • Oberflächliches palyginimas:

    • Patikrina, ar pirmojo lygio raktai ir reikšmės sutampa.
    • Taikoma "plokštiems" objektams be įdėtų objektų ar masyvų.
    • Gali būti įgyvendinta rankiniu būdu pereinant per raktus arba naudojant Object.keys() ir every().
    // Pavyzdys paviršinio palyginimo
    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;
    };
    
  • Gilus palyginimas:

    • Rekursyviai tikrina visas įdėtų objektų ir masyvų lygius.
    • Reikalingas sudėtingų duomenų struktūrų teisingam palyginimui.
    • Gali naudoti rekursiją arba iteratyvų metodą su naudojimu steko.
    • Reikalauja apdoroti įvairių duomenų tipų (primitivų, objektų, masyvų, datų, reguliarių išraiškų).
  • Palyginimas naudojant JSON.stringify():

    • Paverčia objektus į JSON eilutes ir lygina šias eilutes.
    • Paprastas būdas, bet turi apribojimų:
      • Nesižvelgia į raktų tvarką objektuose.
      • Nenaudoja funkcijų, undefined, NaN, Infinity.
      • Gali būti neefektyvus labai dideliems objektams.
    // Pavyzdys palyginimo per `JSON.stringify()`
    const areEqualJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Naudojant trečiųjų šalių bibliotekas:

    • Bibliotekos kaip lodash (funkcija _.isEqual) arba deep-equal siūlo patikimus ir optimizuotus giluminio palyginimo įgyvendinimus, atsižvelgiant į daugybę niuansų (ciklinės nuorodos, skirtingi tipai, kraštiniai atvejai).

Pasirinkimas priklauso nuo reikalingo tikslumo ir palyginamų objektų sudėtingumo. Paprastiems atvejams pakanka paviršinio palyginimo arba JSON.stringify(). Sudėtingoms struktūroms rekomenduojama naudoti giluminį palyginimą arba paruoštas bibliotekas.