TypeError: cyclic object value(TypeError: циклическое значение объекта)

Этот перевод не завершён. Пожалуйста, помогите перевести эту статью с английского

Сообщения

TypeError: циклическое значение объекта (Firefox)
TypeError: преобразование круговой структуры в JSON (Chrome и Opera)
TypeError: циклическая ссылка в аргументе значения не поддерживается (Edge)

Тип ошибки?

TypeError

Что не так?

The JSON format per se doesn't support object references (although an IETF draft exists), hence JSON.stringify() doesn't try to solve them and fail accordingly.

Примеры

В круговой структуре как эта

var circularReference = {otherData: 123};
circularReference.myself = circularReference;

JSON.stringify() закончится неудачей

JSON.stringify(circularReference);
// TypeError: циклическое значение объекта

Для сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.

Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметра replacerJSON.stringify():

const getCircularReplacer = () => {
  const seen = new WeakSet();
  return (key, value) => {
    if (typeof value === "object" && value !== null) {
      if (seen.has(value)) {
        return;
      }
      seen.add(value);
    }
    return value;
  };
};

JSON.stringify(circularReference, getCircularReplacer());
// {"otherData":123}

Смотрите также

  • JSON.stringify
  • cycle.js – вводит две функции, JSON.decycle и JSON.retrocycle, что дает возможность кодирования и декодирования циклических структур и групп обеспечения доступности баз данных в расширенный и обратно совместимый формат JSON.