하나의 JSON.stringify () 는 어떻게 세트 입니까?
Chromium 43에서 작동하지 않은 것 :
var s = new Set(['foo', 'bar']);
JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"
직렬화 된 배열과 비슷한 것을 얻을 것으로 기대합니다.
JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"
답변
JSON.stringify
집합에 저장된 데이터가 속성으로 저장되지 않기 때문에 집합과 직접 작동하지 않습니다.
그러나 집합을 배열로 변환 할 수 있습니다. 그러면 제대로 문자열화할 수 있습니다.
다음 중 하나가 트릭을 수행합니다.
JSON.stringify([...s]);
JSON.stringify([...s.keys()]);
JSON.stringify([...s.values()]);
JSON.stringify(Array.from(s));
JSON.stringify(Array.from(s.keys()));
JSON.stringify(Array.from(s.values()));
답변
다음 JSON.stringify
대체기를 사용하십시오 .
(때문에 toJSON
기존 유물이며, 더 좋은 방법은 사용자 정의를 사용하는 것입니다replacer
참조 https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16를 )
function Set_toJSON(key, value) {
if (typeof value === 'object' && value instanceof Set) {
return [...value];
}
return value;
}
그때:
const fooBar = { foo: new Set([1, 2, 3]), bar: new Set([4, 5, 6]) };
JSON.stringify(fooBar, Set_toJSON)
결과:
"{"foo":[1,2,3],"bar":[4,5,6]}"
답변
위의 모든 작업이 수행되는 동안 하위 클래스를 설정하고 toJSON
stringify가 올바르게 작동하는지 확인 하는 메서드를 추가하는 것이 좋습니다 . 특히 당신이 자주 끈을 묶을 것이라면. 저는 Redux 스토어에서 세트를 사용하고 이것이 문제가되지 않는지 확인해야했습니다.
이것은 기본 구현입니다. 네이밍은 자신의 스타일을 선택하는 포인트를 설명하기위한 것입니다.
class JSONSet extends Set {
toJSON () {
return [...this]
}
}
const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))