Ситуация: мы готовим данные для отправки на сервер из браузера. Чтобы было проще, используем JSON (JavaScript Object Notation). Можно перевести как «способ записи объектов в JavaScript». Формат оказался настолько удобен, что его стали поддерживать практически все популярные языки программирования. Вот подробнее про то, как устроен этот формат и что он умеет:
На старте мы знаем, что данные будут иметь двумерную вложенность. Для этого мы создаём пустой объект, а потом на основе него создаём пару «ключ: значение», чтобы было это удобно было потом перевести в JSON:
var a = { };
var b = { a: a };
После этого мы создаём первый элемент нашей структуры и пробуем отправить данные на сервер, предварительно переведя их в JSON-формат:
a.b = b;
JSON.stringify(a);
Но когда мы пробуем выполнить этот код в браузере, то получаем ошибку:
❌ TypeError: JSON.stringify cannot serialize cyclic structures.
Что это значит: JavaScript не может перевести в JSON-формат вложенные цикличные структуры данных.
Когда встречается: когда мы собираем объект из разных частей, каждая из которых ссылается на другую — использует её в качестве параметра или значения.
Что делать с ошибкой TypeError: JSON.stringify cannot serialize cyclic structures
Чтобы избавиться от ошибки TypeError: JSON.stringify cannot serialize cyclic structures, достаточно убрать вложенную структуру, когда объекты циклично ссылаются друг на друга. В нашем случае объект a содержит объект b, который, в свою очередь, состоит из объектов a.
Лучше всего сделать так: заведём новую переменную, которую и будем потом переводить в JSON-формат:
var a = { };
var b = { a: a };
var c = {};
c[1] = b;
JSON.stringify(c);
Такой подход избавит нас от цикличных связей в объектах, и мы сможем перевести новый объект в JSON-формат.