Sobes.tech
Junior

JavaScript-də obyektləri necə müqayisə etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də obyektlərin birbaşa müqayisəsi === və ya == ilə, onların referens identifikatorunu yoxlayır, içərisindəki bərabərliyi yox. Obiektlərin məzmununa görə müqayisə etmək üçün aşağıdakı yanaşmalar mövcuddur:

  • Yüzeyli müqayisə:

    • Birinci səviyyədə açarların və dəyərlərin uyğun olub-olmadığını yoxlayır.
    • "Yassi" obyektlər üçün, iç-içə obyekt və ya massiv olmayan obyektlər üçün tətbiq edilir.
    • Əl ilə, açarlar üzərində dövr edilərək və ya Object.keys()every() istifadə edilərək həyata keçirilə bilər.
    // Yüzeyli müqayisə nümunəsi
    const eyniYuzeyli = (obj1, obj2) => {
      const acarlar1 = Object.keys(obj1);
      const acarlar2 = Object.keys(obj2);
    
      if (acarlar1.length !== acarlar2.length) {
        return false;
      }
    
      for (let acar of acarlar1) {
        if (obj1[acar] !== obj2[acar]) {
          return false;
        }
      }
    
      return true;
    };
    
  • Dərin müqayisə:

    • Obiektlərin və massivlərin bütün səviyyələrini rekursiv yoxlayır.
    • Çətin məlumat strukturlarının düzgün müqayisəsi üçün lazımdır.
    • Rekursiya və ya yığın istifadə edilə bilər.
    • Müxtəlif məlumat tiplərini (primitivlər, obyektlər, massivlər, tarixlər, müntəzəm ifadələr) idarə etməlidir.
  • JSON.stringify() istifadə edilərək müqayisə:

    • Obiektləri JSON sətirlərinə çevirir və bu sətirləri müqayisə edir.
    • Sadə üsuldur, lakin məhdudiyyətləri var:
      • Obiektlərin açarların sırasını nəzərə almır.
      • Funksiyaları, undefined, NaN, Infinity-ni işlətmir.
      • Çox böyük obyektlər üçün səmərəli olmaya bilər.
    // JSON.stringify ilə müqayisə nümunəsi
    const eyniJSON = (obj1, obj2) => {
      return JSON.stringify(obj1) === JSON.stringify(obj2);
    };
    
  • Xarici kitabxanaların istifadəsi:

    • lodash (məsələn, _.isEqual) və ya deep-equal kimi kitabxanalar, etibarlı və optimallaşdırılmış dərin müqayisə təmin edir, çoxsaylı nüansları nəzərə alır (siklik referanslar, müxtəlif tiplər, sərhəd halları).

Metod seçimi, lazım olan dəqiqlik və müqayisə edilən obyektlərin mürəkkəbliyindən asılıdır. Sadə hallarda, yüzeyli müqayisə və ya JSON.stringify() kifayət edir. Çox mürəkkəb strukturlar üçün dərin müqayisə və ya xüsusi kitabxanalar tövsiyə olunur.