JSON একটি সেট স্ট্রিংফাই করুন


110

কিভাবে একটি 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"]"

উত্তর:


117

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

4
আমার প্রস্তাব ছিল Array.from()। তবে এটি মূর্খতার সাথে আরও ভাল দেখাচ্ছে।
টাওপিআর

4
কেবল কিছু রেফারেন্স যুক্ত করতে এমডিএন এর এই এবং অন্যান্য সম্পর্কিত কৌশলগুলির কয়েকটি উদাহরণ রয়েছে
অমিত

4
একটি তালিকা বোঝার JSON.stringify([_ for (_ of s)])
কাজটিও

4
এটি করার সমস্ত দুর্দান্ত উপায়, দুঃখের সাথে তারা ক্রোমিয়াম 43 বাক্সের বাইরে স্প্রেড হিসাবে কাজ করে না এবং অ্যারে.ফ্রোম এখনও কার্যকর হয় নি। বাবেলকে উদ্ধার করার মতো মনে হচ্ছে।
মিটমারো

4
ডিফল্টটির উন্নতি করার জন্য একটি বর্তমান প্রস্তাব Set.prototype.toJSON: github.com/DavidBruant/Map-Set.prototype.toJSON
টম

35

এই JSON.stringifyreplacer ব্যবহার করুন :

(কারণ 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]}"

6
JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
ES6-তে

সংশ্লিষ্ট রিভিভারটি কি পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে? ;-)
রবার্ট সিমার

9

উপরের সমস্ত কাজ করার সময় আমি প্রস্তাব দিচ্ছি যে আপনি সাবক্লাসটি সেট করুন এবং toJSONএটি সঠিকভাবে স্ট্রিংফাইস হয়েছে কিনা তা নিশ্চিত করার জন্য একটি পদ্ধতি যুক্ত করুন । বিশেষত যদি আপনি প্রায়শই স্ট্রিংফাইজিং করতে যাচ্ছেন। আমি আমার রেডাক্স স্টোরগুলিতে সেট ব্যবহার করি এবং এটি নিশ্চিত করার প্রয়োজন ছিল যে এটি কখনই কোনও সমস্যা ছিল না।

এটি একটি প্রাথমিক বাস্তবায়ন। নামকরণটি আপনার নিজস্ব স্টাইলটি বেছে নেওয়ার বিষয়টি তুলে ধরার জন্য।

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.prototype.toJSON/issues/16
MitMaro

ওভাররাইডিং constructorপ্রয়োজন হয় না।
জাস্টিন জনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.