프로그래밍 언어/HTML,CSS,JS

JSON과 유사한 형식으로 원형 구조를 출력 하는 방법

Rateye 2021. 7. 30. 10:21
728x90
반응형

 

질문 : JSON과 유사한 형식으로 원형 구조를 인쇄하려면 어떻게해야합니까?

JSON으로 변환하여 보내려는 큰 개체가 있습니다. 그러나 그것은 원형 구조를 가지고 있습니다. 나는 순환 참조가 존재하는 모든 것을 던지고 문자열이 될 수있는 것을 보내고 싶습니다. 어떻게하나요?

감사.

var obj = {
  a: "foo",
  b: obj
}

obj를 다음과 같이 문자열 화하고 싶습니다.

{"a":"foo"}
    
답변

사용자 지정 JSON.stringify 와 함께 JSON.stringify를 사용합니다. 예를 들면 :

// Demo: Circular reference
var circ = {};
circ.circ = circ;

// Note: cache should not be re-used by repeated calls to JSON.stringify.
var cache = [];
JSON.stringify(circ, (key, value) => {
  if (typeof value === 'object' && value !== null) {
    // Duplicate reference found, discard key
    if (cache.includes(value)) return;

    // Store value in our collection
    cache.push(value);
  }
  return value;
});
cache = null; // Enable garbage collection

이 예에서 대체자는 100 % 정확하지 않습니다 ( "중복"정의에 따라 다름). 다음과 같은 경우 값이 삭제됩니다.

var a = {b:1}
var o = {};
o.one = a;
o.two = a;
// one and two point to the same object, but two is discarded:
JSON.stringify(o, ...);

그러나 개념은 다음과 같습니다. 사용자 지정 대체자를 사용하고 구문 분석 된 개체 값을 추적합니다.

es6로 작성된 유틸리티 함수 :

// safely handles circular references
JSON.safeStringify = (obj, indent = 2) => {
  let cache = [];
  const retVal = JSON.stringify(
    obj,
    (key, value) =>
      typeof value === "object" && value !== null
        ? cache.includes(value)
          ? undefined // Duplicate reference found, discard key
          : cache.push(value) && value // Store value in our collection
        : value,
    indent
  );
  cache = null;
  return retVal;
};

// Example:
console.log('options', JSON.safeStringify(options))
출처 : https://stackoverflow.com/questions/11616630/how-can-i-print-a-circular-structure-in-a-json-like-format
728x90
반응형