JSON एक सेट को कठोर करता है


99

कैसे एक होगा JSON.stringify () एक सेट ?

क्रोमियम 43 में काम नहीं आने वाली चीजें:

var s = new Set(['foo', 'bar']);

JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"

मैं एक क्रमबद्ध सरणी के समान कुछ पाने की उम्मीद करूंगा।

JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"

जवाबों:


105

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()));

2
मैं प्रपोज करने वाला था Array.from()। लेकिन यह मुहावरेदार रूप से बेहतर लगता है।
ताओप्रो

3
कुछ संदर्भों को जोड़ने के लिए एमडीएन में इसके और अन्य संबंधित तकनीकों के कुछ उदाहरण हैं
अमित

5
एक सूची समझ के रूप में अच्छी तरह से काम कर सकता है:JSON.stringify([_ for (_ of s)])
Whymarrh

1
इसे करने के सभी शानदार तरीके, दुख की बात है कि वे क्रोमियम 43 में बॉक्स से बाहर फैलने के रूप में काम नहीं करते हैं और Array.from अभी तक लागू नहीं हुए हैं। बचाव के लिए बेबल की तरह दिखता है।
मितमरो

2
डिफ़ॉल्ट में सुधार करने के लिए एक वर्तमान प्रस्ताव Set.prototype.toJSON: github.com/DavidBruant/Map-Set.prototyp.toJSON
Oncle Tom

34

इस JSON.stringifyप्रतिकृति का उपयोग करें :

(क्योंकि toJSONएक विरासत कलाकृतियों है, और एक बेहतर तरीका एक कस्टम का उपयोग करना हैreplacer , https://github.com/DavidBruant/Map-Set.prototyp.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]}"

5
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
ES25

संबंधित श्रोता पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है? ;-)
रॉबर्ट सीमर

7

हालांकि उपरोक्त सभी काम मैं सुझाव देता हूं कि आप सेट उप-सेट करें और toJSONयह सुनिश्चित करने के लिए एक विधि जोड़ें कि यह सही ढंग से स्ट्रिंग करता है। खासतौर पर तब जब आप अक्सर स्ट्रगल करने वाले हों। मैं अपने Redux स्टोर्स में सेट का उपयोग करता हूं और यह सुनिश्चित करने की आवश्यकता है कि यह कभी भी समस्या नहीं थी।

यह एक बुनियादी कार्यान्वयन है। नामकरण केवल इस बिंदु को दर्शाने के लिए है कि आप अपनी शैली चुनें।

class JSONSet extends Set {
    toJSON () {
        return [...this]
    }
}

const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))

4
मैं इस दृष्टिकोण की सिफारिश नहीं करूंगा क्योंकि toJSONइसे एक विरासत विशेषता माना जाता है। toJSONदोनों को जोड़ने का प्रस्ताव setऔर mapअस्वीकार कर दिया गया था: github.com/DavidBruant/Map-Set.prototyp.toJSON/issues/16
मिटमरो

ओवरराइडिंग constructorआवश्यक नहीं है।
जस्टिन जॉनसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.