2015-09-01 16 views
6

Próbuję stringify javascript obiektu, jednak kiedy robię to get następujący błąd:JavaScript: Błąd typu: cyklicznie wartość obiektu

TypeError: cyclic object value

ja nie wierzę, że mój kod zawiera żadnych odniesień cykliczne (newServiceObject nie jest odwoływany wewnątrz obiektu), więc nie rozumiem, dlaczego otrzymuję tę wiadomość.

Chcę przekształcić obiekt zawierający dwie właściwości i tablicę w pojedynczy ciąg.

var serviceName = $('#newServiceNameBox').val(); 
     var serviceCodeElemList = $(".ServiceCodeName").map(function() { return $(this).html(); }); 
     //create the new service object 
     var newServiceObject = {ServiceId:-1, ServiceName: serviceName, ServiceCodes: serviceCodeElemList }; 

     var appendNewService = '&newService='+JSON.stringify(newServiceObject); 

Błąd występuje na ostatniej linii (JSON.stringify()), ale nie mam pojęcia, dlaczego!

+0

ownerDocument można dodawać dane JSON w 'newServiceObject' obiekt? –

Odpowiedz

4

Dzieje się tak zazwyczaj dlatego, że próbujesz serializować obiekt JavaScript, który ma właściwości, które wskazują na siebie w cyklu.

W twoim przykładzie newServiceObject.serviceCodeElemList wskazuje na obiekt jQuery, który ma w sobie cykle: jego właściwość context, która wskazuje obiekt dokumentu. Obiekt dokument zawiera odnośniki do elementów DOM, które mają wskaźniki z powrotem do dokumentu za pośrednictwem właściwości

var jqueryObj = $('div'); 
 
    console.log(jqueryObj.context); // Document object 
 
    console.log(jqueryObj.context.body.firstChild.ownerDocument); // Document object 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div></div>

+0

zobacz odpowiedź powyżej! Jak na moje pytanie, nie widziałem niczego oczywistego w moim kodzie. Domyślam się, że coś wewnętrznego do obiektu jquery robi to –

+0

@NeilP Zmodyfikowałem odpowiedź, aby wyjaśnić, gdzie jest cykl w obiektach jQuery. –

+0

To wyjaśnia! –

2

Znaleziono!

Mój problem polegał na tym, że przy korzystaniu z jquery do zbudowania tablicy, powinienem dołączyć metodę ToArray() po funkcji mapowania.

Dlatego też, gdy tablica jest zawarta w obiekcie, jest to standardowa tablica, a nie obiekt jquery.

Powiązane problemy