Geçenlerde karşılaştığım ve hatayı nasıl çözebilirim diye internette ararken sizinle paylaşmak istediğim bir problemden bahsetmek istiyorum.

“TypeError: Converting circular structure to JSON”

Bu hata iki objenin birbirini referans etmesi sonucu sizin objenizi serialize ( JSON.stringify() ) etmek istemeniz durumunda karşılacağınız bir hata.

Hatayı çözmek için hangi iki objenin birbirini referans ettiğini bulmanız ve bu bağımlılıkları kaldırmanız gerekmektedir. Objeniz yeterince karmaşık bir yapıdaysa( iç içe objelerin olduğu, obje içinde objeler tuttuğunuz yapılar ) hangi hiyerarşide birbirine referans edildiğini bulmanız gözle bulmanız neredeyse imkansız hale geliyor. Bu yüzden size aşağıda kullandığım, birbirine referans eden objeleri gösteren kod parçacıklarını paylaştım.

function isCyclic(obj) {
  var keys = [];
  var stack = [];
  var stackSet = new Set();
  var detected = false;

  function detect(obj, key) {
    if (obj && typeof obj != 'object') { return; }

    if (stackSet.has(obj)) { // it's cyclic! Print the object and its locations.
      var oldindex = stack.indexOf(obj);
      var l1 = keys.join('.') + '.' + key;
      var l2 = keys.slice(0, oldindex + 1).join('.');
      console.log('CIRCULAR: ' + l1 + ' = ' + l2 + ' = ' + obj);
      console.log(obj);
      detected = true;
      return;
    }

    keys.push(key);
    stack.push(obj);
    stackSet.add(obj);
    for (var k in obj) { //dive on the object's children
      if (obj.hasOwnProperty(k)) { detect(obj[k], k); }
    }

    keys.pop();
    stack.pop();
    stackSet.delete(obj);
    return;
  }

  detect(obj, 'obj');
  return detected;
}

2 Yorumlar

  1. Merhaba, Elinize sağlık.
    Test için şunu uygulayabiliriz;

    var root = {}
    var leaf = {‘isleaf’:true};
    var cycle2 = {l:leaf};
    var cycle1 = {c2: cycle2, l:leaf};
    cycle2.c1 = cycle1
    root.leaf = leaf

    isCyclic(cycle1); // returns true, logs “CIRCULAR: obj.c2.c1 = obj”
    isCyclic(cycle2); // returns true, logs “CIRCULAR: obj.c1.c2 = obj”
    isCyclic(leaf); // returns false
    isCyclic(root); // returns false

Sümeyra Kaşıkçı için bir cevap yazın İptal

Lütfen yorumunuzu yazınız!
Lütfen isminizi buraya giriniz