এইচটিএমএল 5 লোকালস্টোরেজে অবজেক্টগুলি সংরক্ষণ করা


2510

আমি এইচটিএমএল 5 এ একটি জাভাস্ক্রিপ্ট অবজেক্ট সংরক্ষণ করতে চাই localStorage, তবে আমার অবজেক্টটি স্পষ্টতই একটি স্ট্রিতে রূপান্তরিত হচ্ছে।

আমি আদিম জাভাস্ক্রিপ্টের ধরণ এবং অ্যারে ব্যবহার করে সঞ্চয় করতে এবং পুনরুদ্ধার করতে localStorageপারি তবে অবজেক্টগুলি কাজ করে বলে মনে হয় না। তাদের উচিত?

আমার কোডটি এখানে:

var testObject = { 'one': 1, 'two': 2, 'three': 3 };
console.log('typeof testObject: ' + typeof testObject);
console.log('testObject properties:');
for (var prop in testObject) {
    console.log('  ' + prop + ': ' + testObject[prop]);
}

// Put the object into storage
localStorage.setItem('testObject', testObject);

// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');

console.log('typeof retrievedObject: ' + typeof retrievedObject);
console.log('Value of retrievedObject: ' + retrievedObject);

কনসোল আউটপুট হয়

typeof testObject: object
testObject properties:
  one: 1
  two: 2
  three: 3
typeof retrievedObject: string
Value of retrievedObject: [object Object]

আমার কাছে দেখে মনে হচ্ছে setItemপদ্ধতিটি স্টোর করার আগে ইনপুটটিকে স্ট্রিংয়ে রূপান্তর করছে।

আমি সাফারি, ক্রোম এবং ফায়ারফক্সে এই আচরণটি দেখি, তাই আমি ধরে নিই যে এটি ব্রাউজার-নির্দিষ্ট বাগ বা সীমাবদ্ধতা নয়, এইচটিএমএল 5 ওয়েব স্টোরেজ অনুচ্ছেদে আমার ভুল ধারণা ।

আমি http://www.w3.org/TR/html5/inf पाया। Html এ বর্ণিত কাঠামোগত ক্লোন অ্যালগরিদমকে বোঝার চেষ্টা করেছি । আমি এটি কী বলছি তা পুরোপুরি বুঝতে পারছি না, তবে আমার সমস্যাটির সাথে আমার অবজেক্টের বৈশিষ্ট্যগুলি অগণনীয় না হওয়ার সাথে করতে হবে (???)

একটি সহজ workaround আছে?


আপডেট: অবশেষে ডাব্লু 3 সি স্ট্রাকচার্ড-ক্লোন স্পেসিফিকেশন সম্পর্কে তাদের মতামত পরিবর্তন করেছে এবং বাস্তবায়নের সাথে মেলে বিশেষে পরিবর্তন করার সিদ্ধান্ত নিয়েছে। Https://www.w3.org/Bugs/Public/show_bug.cgi?id=12111 দেখুন । সুতরাং এই প্রশ্নটি আর 100% বৈধ নয়, তবে উত্তরগুলি এখনও আগ্রহী হতে পারে।


17
বিটিডাব্লু, আপনার "স্ট্রাকচার্ড ক্লোন অ্যালগরিদম" পড়ার বিষয়টি সঠিক, বাস্তবায়নটি শেষ হওয়ার পরে, স্পিকটি স্ট্রিং-ওয়ান মান থেকে এটিতে পরিবর্তিত হয়েছিল। আমি এই সমস্যাটি ট্র্যাক করতে মোজিলায় বাগ বাগিলা.মোজিলা.আর / শো_বগ.সি.ইইডি = 538142 দায়ের করেছি ।
নিকোলায়


1
লোকালস্টোররেজগুলিতে একটি অ্যারে অবজেক্ট সম্পর্কে কীভাবে? আমি একই সমস্যার মুখোমুখি হয়েছি যে এটি স্ট্রিংয়ে রূপান্তরিত হচ্ছে।
জয়ন্ত প্যারিক

1
আপনি কি পরিবর্তে অ্যারে সিরিয়ালাইজ করতে পারেন? JSON স্ট্রিংয়েফের সাথে স্টোরের মতো আবার লোড হওয়ার পরে পার্স করতে চান?
ব্র্যান্ডিতো

1
আপনি জাভাস্ক্রিপ্ট ডেটা ধরণের (অ্যারে, বুলিয়ান, তারিখ, ভাসা, পূর্ণসংখ্যা, স্ট্রিং এবং অবজেক্ট) স্বচ্ছভাবে সঞ্চয় করতে স্থানীয় ডেটা স্টোরেজ ব্যবহার করতে পারেন
ম্যাক

উত্তর:


3169

অ্যাপল , মজিলা এবং মজিলা আবার ডকুমেন্টেশনের দিকে তাকালে , কার্যকারিতা কেবল স্ট্রিং কী / মান জোড়গুলি হ্যান্ডেল করে সীমাবদ্ধ বলে মনে হচ্ছে।

আপনার অবজেক্টটি স্টোর করার আগে আরও শক্তিশালী করা এবং পরে যখন এটি পুনরুদ্ধার করা হয় তখন পার্স করতে পারেন:

var testObject = { 'one': 1, 'two': 2, 'three': 3 };

// Put the object into storage
localStorage.setItem('testObject', JSON.stringify(testObject));

// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');

console.log('retrievedObject: ', JSON.parse(retrievedObject));

159
যে কোনও মেটাডেটা সরানো হবে তা পর্যবেক্ষণ করবেন। আপনি কেবল কী-মান জোড়ার সাথে একটি বস্তু পেয়েছেন, সুতরাং আচরণের সাথে কোনও বস্তু পুনর্নির্মাণ করা দরকার।
অলিগোফ্রেন

5
@ সিএমএস ডেটা সক্ষমতা বেশি হলে কিছু ব্যতিক্রম ছুঁড়ে দিতে পারে?
আশীষ নেগি

3
... কেবলমাত্র বিজ্ঞপ্তিযুক্ত রেফারেন্স সহ অবজেক্টগুলিতে প্রযোজ্য, JSON.stringify()রেফারেন্স করা অবজেক্টটিকে তার পূর্ণ "সামগ্রী" (স্পষ্টভাবে স্ট্রিংয়েড) এ প্রসারিত করে যা আমরা স্ট্রিংফাইজ করি সেই অবজেক্টে। দেখুন: stackoverflow.com/a/12659424/2044940
CodeManX

3
আপনার যদি বড় অ্যারে বা অবজেক্টগুলি পরিচালনা করতে হয় তবে এই পদ্ধতির সমস্যা হ'ল পারফরম্যান্স সমস্যা।
চিহ্নিত করুন

3
@ অলিগোফ্রেন সত্য, তবে মাজা সঠিকভাবে ইওল () => এর পরামর্শ দিলে এটি একটি ভাল ব্যবহার, আপনি সহজেই ফাংশন কোডটি পুনরুদ্ধার করতে পারেন>> এটি স্ট্রিং হিসাবে সংরক্ষণ করতে পারেন এবং তারপরে এটি () ফিরে আসতে পারেন :)
jave.web

621

বৈকল্পিকের উপর একটি সামান্য উন্নতি :

Storage.prototype.setObject = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObject = function(key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

কারণ শর্ট সার্কিট মূল্যায়ন , getObject()হবে অবিলম্বে আসতে nullযদি keyStorage এ নয়। এটি হ'ল (খালি স্ট্রিং; এটি পরিচালনা করতে পারে না) SyntaxErrorব্যতিক্রমও ছুঁড়ে না।value""JSON.parse()


48
আমি কেবলমাত্র তাড়াতাড়ি ব্যবহারটি যুক্ত করতে চাই কারণ তা আমার জন্য তাত্ক্ষণিকভাবে পরিষ্কার ছিল না: var userObject = { userId: 24, name: 'Jack Bauer' }; এবং এটি সেট localStorage.setObject('user', userObject); করতে আবার স্টোরেজ থেকে ফিরে পেতে userObject = localStorage.getObject('user'); আপনি চাইলে এমনকি একটি অ্যারে অবজেক্টও সঞ্চয় করতে পারেন।
zuallauz

8
এটি কেবল বুলিয়ান এক্সপ্রেশন। বাম অংশটি সত্য হলেই দ্বিতীয় অংশটি মূল্যায়ন করা হয়। সেক্ষেত্রে পুরো প্রকাশের ফলাফলটি ডান দিক থেকে হবে। বুলিয়ান এক্সপ্রেশনকে কীভাবে মূল্যায়ন করা হয় তার ভিত্তিতে এটি জনপ্রিয় টেকনিক।
গুরিয়া

4
আমি এখানে স্থানীয় পরিবর্তনশীল এবং শর্টকাট মূল্যায়নের বিন্দু দেখতে পাচ্ছি না (একপাশে ছোটখাটো পারফরম্যান্স উন্নতি)। যদি keyস্থানীয় সঞ্চয় নেই, window.localStorage.getItem(key)আয় null- এটা নেই না এবং - একটি "অবৈধ অ্যাক্সেস" ব্যতিক্রম নিক্ষেপ JSON.parse(null)আয় nullপাশাপাশি - এটা নেই না , সেই জন্য Chromium 21 কিংবা প্রতি তন্ন তন্ন পারেন একটি ব্যতিক্রম নিক্ষেপ ইএস 5.1 অধ্যায় 15.12.2 , কারণ String(null) === "null"যা যা করতে পারেন একটি JSON আক্ষরিক হিসাবে ব্যাখ্যা করা ।
পয়েন্টেড ইয়ার্স

6
লোকাল স্টোরেজের মানগুলি সর্বদা আদিম স্ট্রিংয়ের মান। সুতরাং এই শর্টকাট মূল্যায়ন হ্যান্ডেলটি করে যখন কেউ ""আগে (খালি স্ট্রিং) সঞ্চয় করে। কারণ এটি টাইপ-রূপান্তর করে falseএবং JSON.parse("")যা একটি SyntaxErrorব্যতিক্রম ছুঁড়ে ফেলে তাকে ডাকা হয় না।
অষ্টম 8'12

2
এটি আইই 8 তে কাজ করবে না, তাই আপনার যদি এটির সমর্থন প্রয়োজন হয় তবে আপনি নিশ্চিত উত্তরে ফাংশনগুলি ব্যবহার করা আরও ভাল।
ইজেক

220

এই সহজ পদ্ধতি সহ স্টোরেজ অবজেক্টটি প্রসারিত করা আপনার পক্ষে দরকারী হতে পারে:

Storage.prototype.setObject = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObject = function(key) {
    return JSON.parse(this.getItem(key));
}

আপনি API এর নীচে কেবল স্ট্রিংগুলিকে সমর্থন করলেও আপনি যে কার্যকারিতাটি সত্যই চেয়েছিলেন তা এইভাবে পান।


13
কোনও কার্যক্রমে সিএমএসের পদ্ধতিকে আবদ্ধ করা একটি ভাল ধারণা, এটির জন্য কেবল একটি বৈশিষ্ট্য পরীক্ষা করা দরকার: একটি জেএসএন.স্ট্রিফাইফাইয়ের জন্য, একটি জেএসএন.পার্সের জন্য এবং একটি পরীক্ষা করার জন্য যদি লোকালস্টোরেজ আসলে কোনও বস্তু সেট এবং পুনরুদ্ধার করতে পারে। হোস্ট অবজেক্টগুলি সংশোধন করা ভাল ধারণা নয়; আমি বরং এটি একটি পৃথক পদ্ধতি হিসাবে দেখতে চাই এবং না localStorage.setObject
গ্যারেট

4
এই getObject()একটি নিক্ষেপ করা হবে SyntaxErrorযদি সঞ্চিত মান ব্যতিক্রম ""কারণ, JSON.parse()করতে পারে হ্যান্ডেল করতে। বিশদর জন্য গুরুয়ার উত্তরে আমার সম্পাদনা দেখুন।
পয়েন্টেড ইয়ার্স

9
কেবল আমার দুটি সেন্ট, তবে আমি নিশ্চিত যে এটি বিক্রেতার দ্বারা সরবরাহিত সামগ্রীগুলি প্রসারিত করা ভাল ধারণা নয় pretty
শেফেন


73

স্টোরেজ অবজেক্টটি প্রসারিত করা একটি দুর্দান্ত সমাধান। আমার এপিআইয়ের জন্য, আমি লোকালস্টোরেজের জন্য একটি মুখোমুখি তৈরি করেছি এবং তারপরে এটি নির্ধারণ এবং পাওয়ার সময় কোনও বস্তু কিনা তা পরীক্ষা করে দেখছি।

var data = {
  set: function(key, value) {
    if (!key || !value) {return;}

    if (typeof value === "object") {
      value = JSON.stringify(value);
    }
    localStorage.setItem(key, value);
  },
  get: function(key) {
    var value = localStorage.getItem(key);

    if (!value) {return;}

    // assume it is an object that has been stringified
    if (value[0] === "{") {
      value = JSON.parse(value);
    }

    return value;
  }
}

1
এটি আমার প্রয়োজন মতো প্রায় ছিল। মন্তব্যের আগে (মান == নাল) false মিথ্যা ফিরিয়ে দিন if অন্যথায় যুক্ত করতে হয়েছিল, অন্যথায় লোকালস্টোরারেজে কোনও কীটির অস্তিত্ব পরীক্ষা করার সময় ত্রুটি হয়েছিল in
ফ্রান্সেস্কো ফ্রেপ্পোর্তি

2
এটি আসলে বেশ দুর্দান্ত। @ ফ্রান্সস্কো ফ্রেপ্পের্তির সাথে সম্মত হন নাল মানগুলির জন্য আপনার যদি সেখানে প্রয়োজন হয়। আমিও একটি যুক্ত করেছি '|| মান [0] == "[" "পরীক্ষার ক্ষেত্রে সেখানে কোনও অ্যারে রয়েছে।
rob_james 0

ভাল কথা, আমি এটি সম্পাদনা করব। যদিও আপনার নাল অংশের প্রয়োজন নেই, তবে আপনি যদি আমি তিনটি === সুপারিশ করি। যদি আপনি জেএসহিন্ট বা জেএসলিন্ট ব্যবহার করেন তবে আপনাকে == ব্যবহার করার বিরুদ্ধে সতর্ক করা হবে।
অ্যালেক্স গ্র্যান্ডে

3
এবং নন-নিনজদের (আমার মতো) জন্য, কেউ দয়া করে এই উত্তরটির জন্য কোনও ব্যবহারের উদাহরণ সরবরাহ করতে পারেন? এটি হল: data.set('username': 'ifedi', 'fullname': { firstname: 'Ifedi', lastname: 'Okonkwo'});?
ইফেদী ওকনকভো

হ্যাঁ! আমি যখন আমার চামচ খাওয়ানোর ইচ্ছাটি কাটিয়ে উঠি, আমি পরীক্ষার কোডটি নিয়েছিলাম এবং তা পেয়েছিলাম। আমি মনে করি এই উত্তরটি দুর্দান্ত কারণ 1) স্বীকৃত উত্তরের মতো নয়, স্ট্রিংয়ের ডেটাতে কিছু নির্দিষ্ট চেক করতে সময় লাগে এবং ২) পরেরটির মতো, এটি কোনও নেটিভ অবজেক্টকে বাড়িয়ে দেয় না।
ইফেদী ওকনক্বো

64

স্ট্রিংফাই সমস্ত সমস্যা সমাধান করে না

দেখে মনে হয় যে এখানে উত্তরগুলি জাভাস্ক্রিপ্টে সম্ভব সমস্ত প্রকারকে কভার করে না, সুতরাং কীভাবে সঠিকভাবে সেগুলি মোকাবেলা করতে হবে তার কয়েকটি সংক্ষিপ্ত উদাহরণ এখানে:

//Objects and Arrays:
    var obj = {key: "value"};
    localStorage.object = JSON.stringify(obj);  //Will ignore private members
    obj = JSON.parse(localStorage.object);
//Boolean:
    var bool = false;
    localStorage.bool = bool;
    bool = (localStorage.bool === "true");
//Numbers:
    var num = 42;
    localStorage.num = num;
    num = +localStorage.num;    //short for "num = parseFloat(localStorage.num);"
//Dates:
    var date = Date.now();
    localStorage.date = date;
    date = new Date(parseInt(localStorage.date));
//Regular expressions:
    var regex = /^No\.[\d]*$/i;     //usage example: "No.42".match(regex);
    localStorage.regex = regex;
    var components = localStorage.regex.match("^/(.*)/([a-z]*)$");
    regex = new RegExp(components[1], components[2]);
//Functions (not recommended):
    function func(){}
    localStorage.func = func;
    eval( localStorage.func );      //recreates the function with the name "func"

আমি ফাংশনগুলি সংরক্ষণ করার প্রস্তাব দিই না কারণ eval()খারাপ কারণটি সুরক্ষা, অপ্টিমাইজেশন এবং ডিবাগিং সম্পর্কিত সমস্যাগুলির দিকে নিয়ে যেতে পারে। সাধারণভাবে,eval() জাভাস্ক্রিপ্ট কোড ব্যবহার করা উচিত নয়।

ব্যক্তিগত সদস্যরা

JSON.stringify()বস্তু সংরক্ষণের জন্য ব্যবহার করার ক্ষেত্রে সমস্যাটি হ'ল এই ফাংশনটি ব্যক্তিগত সদস্যদের সিরিয়াল করতে পারে না। .toString()পদ্ধতিটি ওভাররাইট করে এই সমস্যাটি সমাধান করা যেতে পারে (যা ওয়েব স্টোরেজে ডেটা সংরক্ষণের সময় স্পষ্টভাবে বলা হয়):

//Object with private and public members:
    function MyClass(privateContent, publicContent){
        var privateMember = privateContent || "defaultPrivateValue";
        this.publicMember = publicContent  || "defaultPublicValue";

        this.toString = function(){
            return '{"private": "' + privateMember + '", "public": "' + this.publicMember + '"}';
        };
    }
    MyClass.fromString = function(serialisedString){
        var properties = JSON.parse(serialisedString || "{}");
        return new MyClass( properties.private, properties.public );
    };
//Storing:
    var obj = new MyClass("invisible", "visible");
    localStorage.object = obj;
//Loading:
    obj = MyClass.fromString(localStorage.object);

বিজ্ঞপ্তি রেফারেন্স

আর একটি সমস্যা stringifyহ'ল সার্কুলার রেফারেন্সগুলি:

var obj = {};
obj["circular"] = obj;
localStorage.object = JSON.stringify(obj);  //Fails

এই উদাহরণে, JSON.stringify()একটি TypeError "JSON এ রূপান্তরকারী বিজ্ঞপ্তি কাঠামো" ফেলে দেবে । যদি বিজ্ঞপ্তি রেফারেন্সগুলি সংরক্ষণ করে সমর্থন করা উচিত, তবে দ্বিতীয় প্যারামিটার JSON.stringify()ব্যবহার করা যেতে পারে:

var obj = {id: 1, sub: {}};
obj.sub["circular"] = obj;
localStorage.object = JSON.stringify( obj, function( key, value) {
    if( key == 'circular') {
        return "$ref"+value.id+"$";
    } else {
        return value;
    }
});

তবে বিজ্ঞপ্তি রেফারেন্সগুলি সংরক্ষণ করার জন্য একটি কার্যকর সমাধান সন্ধান করা যে কাজগুলি সমাধান করা দরকার তার উপর নির্ভর করে এবং এই জাতীয় ডেটা পুনরুদ্ধার করাও তুচ্ছ নয়।

এই সমস্যার সাথে মোকাবিলা করার জন্য ইতিমধ্যে কিছু প্রশ্ন রয়েছে: বৃত্তাকার রেফারেন্স সহ একটি জাভাস্ক্রিপ্ট অবজেক্ট স্ট্রিংফাই (JSON এ রূপান্তর করুন)


2
অতএব, এবং এটি বলা বাহুল্য - স্টোরেজে ডেটা সংরক্ষণ করা সহজ ডেটাগুলির অনুলিপিগুলির একমাত্র ভিত্তির ভিত্তিতে হওয়া উচিত । লাইভ অবজেক্টস নয়।
রোকো সি বুলজান

51

একটি দুর্দান্ত গ্রন্থাগার রয়েছে যা অনেকগুলি সমাধানগুলিকে আবৃত করে তাই এটি এমনকি jStorage নামে পুরানো ব্রাউজারগুলিকে সমর্থন করে

আপনি একটি বিষয় সেট করতে পারেন

$.jStorage.set(key, value)

এবং সহজেই এটি পুনরুদ্ধার করুন

value = $.jStorage.get(key)
value = $.jStorage.get(key, "default value")

2
@ সুপারউবারডুপার জাস্টোরেজটির জন্য প্রোটোটাইপ, মূটুলস বা জিকুয়েরি প্রয়োজন
জেপোগ্রামার

28

তত্ত্ব অনুসারে, ফাংশন সহ বস্তুগুলি সংরক্ষণ করা সম্ভব:

function store (a)
{
  var c = {f: {}, d: {}};
  for (var k in a)
  {
    if (a.hasOwnProperty(k) && typeof a[k] === 'function')
    {
      c.f[k] = encodeURIComponent(a[k]);
    }
  }

  c.d = a;
  var data = JSON.stringify(c);
  window.localStorage.setItem('CODE', data);
}

function restore ()
{
  var data = window.localStorage.getItem('CODE');
  data = JSON.parse(data);
  var b = data.d;

  for (var k in data.f)
  {
    if (data.f.hasOwnProperty(k))
    {
      b[k] = eval("(" + decodeURIComponent(data.f[k]) + ")");
    }
  }

  return b;
}

যাইহোক, ফাংশন সিরিয়ালাইজেশন / deserialization অবিশ্বাস্য কারণ এটি বাস্তবায়ন নির্ভর


1
ফাংশন সিরিয়ালাইজেশন / deserialization অবিশ্বাস্য কারণ এটি বাস্তবায়ন নির্ভর । এছাড়াও, আপনি c.f[k] = escape(a[k]); ইউনিকোড-সেফ c.f[k] = encodeURIComponent(a[k]);এবং এর eval('b.' + k + ' = ' + unescape(data.f[k]));সাথে প্রতিস্থাপন করতে চান b[k] = eval("(" + decodeURIComponent(data.f[k]) + ")");। প্রথম বন্ধনী আবশ্যক কারণ আপনার ক্রিয়াকলাপটি যদি যথাযথভাবে সিরিয়ালযুক্ত করা হয় তবে সম্ভবত বেনামে থাকতে পারে যা বৈধ / বিবৃতি হিসাবে নয় ( অন্যথায় eval()একটি SyntaxErrorব্যতিক্রম নষ্ট করবে )।
পয়েন্টেড ইয়ারস

এবং typeofএকটি অপারেটর , এটি কোনও ফাংশন হিসাবে এটি লিখবেন না। typeof(a[k])সঙ্গে প্রতিস্থাপন typeof a[k]
পয়েন্টেড ইয়ারস

আমার পরামর্শগুলি প্রয়োগ করার এবং পদ্ধতির অবিশ্বাস্যতার উপর জোর দেওয়ার পাশাপাশি, আমি নিম্নলিখিত বাগগুলি স্থির করেছি: ১. সমস্ত ভেরিয়েবল ঘোষিত হয়নি। 2. for- inনিজস্ব সম্পত্তি জন্য ফিল্টার করা হয়নি। ৩. রেফারেন্সিং সহ কোড শৈলী অসঙ্গত ছিল।
পয়েন্টইয়ারস্

@ প্রস্তাবিত আগে ব্যবহারিক পার্থক্য কি? অনুমানটি বলে যে the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent. আমি কোনও কার্যকরী পার্থক্য দেখছি না।
মাইকেল 19

@ মিশেল আপনি যে অংশটি উদ্ধৃত করেছেন তা দিয়ে শুরু হয় Note *in particular* that …। তবে রিটার্ন ভ্যালু স্পেসিফিকেশনটি শুরু হয় An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration.রিটার্ন মান হতে পারে function foo () {}- অনুমানযোগ্য বাস্তবায়ন ধরে নেওয়া ।
পয়েন্টেড ইয়ারস

22

আমি এর পোস্টে এসে পৌঁছেছি এমন অন্য পোস্টে আঘাত করার পরে যা এর নকল হিসাবে বন্ধ করা হয়েছে - শিরোনামে 'লোকালস্টোরেজে অ্যারে কীভাবে সংরক্ষণ করবেন?' শিরোনাম। থ্রেড উভয়ই বাদ দিয়ে যা ঠিক আছে তা কীভাবে আপনি লোকালস্টোরারে কোনও অ্যারে বজায় রাখতে পারবেন সে সম্পর্কে একটি সম্পূর্ণ উত্তর সরবরাহ করে - তবে আমি উভয় থ্রেডে থাকা তথ্যের উপর ভিত্তি করে কোনও সমাধান তৈরি করতে সক্ষম হয়েছি।

সুতরাং অন্য কেউ যদি অ্যারেতে পপ / পপ / শিফট আইটেমগুলিকে ধাক্কা দিতে সক্ষম হতে চান এবং তারা সেই অ্যারেটি স্থানীয় স্টোরেজ বা প্রকৃতপক্ষে সেশন স্টোরেজে সঞ্চিত রাখতে চান তবে আপনি এখানে যান:

Storage.prototype.getArray = function(arrayName) {
  var thisArray = [];
  var fetchArrayObject = this.getItem(arrayName);
  if (typeof fetchArrayObject !== 'undefined') {
    if (fetchArrayObject !== null) { thisArray = JSON.parse(fetchArrayObject); }
  }
  return thisArray;
}

Storage.prototype.pushArrayItem = function(arrayName,arrayItem) {
  var existingArray = this.getArray(arrayName);
  existingArray.push(arrayItem);
  this.setItem(arrayName,JSON.stringify(existingArray));
}

Storage.prototype.popArrayItem = function(arrayName) {
  var arrayItem = {};
  var existingArray = this.getArray(arrayName);
  if (existingArray.length > 0) {
    arrayItem = existingArray.pop();
    this.setItem(arrayName,JSON.stringify(existingArray));
  }
  return arrayItem;
}

Storage.prototype.shiftArrayItem = function(arrayName) {
  var arrayItem = {};
  var existingArray = this.getArray(arrayName);
  if (existingArray.length > 0) {
    arrayItem = existingArray.shift();
    this.setItem(arrayName,JSON.stringify(existingArray));
  }
  return arrayItem;
}

Storage.prototype.unshiftArrayItem = function(arrayName,arrayItem) {
  var existingArray = this.getArray(arrayName);
  existingArray.unshift(arrayItem);
  this.setItem(arrayName,JSON.stringify(existingArray));
}

Storage.prototype.deleteArray = function(arrayName) {
  this.removeItem(arrayName);
}

উদাহরণস্বরূপ ব্যবহার - স্থানীয় স্টোরেজ অ্যারেতে সরল স্ট্রিংগুলি সঞ্চয় করা:

localStorage.pushArrayItem('myArray','item one');
localStorage.pushArrayItem('myArray','item two');

উদাহরণস্বরূপ ব্যবহার - সেশন স্টোরেজ অ্যারেতে অবজেক্টগুলি সঞ্চয় করা:

var item1 = {}; item1.name = 'fred'; item1.age = 48;
sessionStorage.pushArrayItem('myArray',item1);

var item2 = {}; item2.name = 'dave'; item2.age = 22;
sessionStorage.pushArrayItem('myArray',item2);

অ্যারে হেরফের করার সাধারণ পদ্ধতি:

.pushArrayItem(arrayName,arrayItem); -> adds an element onto end of named array
.unshiftArrayItem(arrayName,arrayItem); -> adds an element onto front of named array
.popArrayItem(arrayName); -> removes & returns last array element
.shiftArrayItem(arrayName); -> removes & returns first array element
.getArray(arrayName); -> returns entire array
.deleteArray(arrayName); -> removes entire array from storage

লোকালস্টোরেজ বা সেশনস স্টোরেজে সংরক্ষিত অ্যারেগুলিকে পরিচালনা করার জন্য এটি খুব সহজ পদ্ধতির একটি সেট এবং এটি আকৃষ্ট হওয়ার চেয়ে অনেক বেশি creditণের দাবিদার। অ্যান্ডি লরেঞ্জ শেয়ার করার জন্য সময় দেওয়ার জন্য ধন্যবাদ!
ভেলোজেট


14

এখানে আলোচিত বৈশিষ্ট্যগুলির পাশাপাশি আরও ভাল সামঞ্জস্যের জন্য একটি বিমূর্ত গ্রন্থাগার ব্যবহারের পরামর্শ দিন। প্রচুর বিকল্প:


6

আপনি স্থানীয় ডেটাস্টোরেজ ব্যবহার করতে পারেন জাভাস্ক্রিপ্ট ডেটা ধরণের (অ্যারে, বুলিয়ান, তারিখ, ভাসা, পূর্ণসংখ্যা, স্ট্রিং এবং অবজেক্ট) স্বচ্ছভাবে সঞ্চয় । এটি স্বল্প ওজনের ডেটা অবলুপ্তি সরবরাহ করে, স্বয়ংক্রিয়ভাবে স্ট্রিংগুলি সংকুচিত করে, কী (নাম) দ্বারা ক্যোয়ারী পাশাপাশি (কী) মান অনুসারে কোয়েরি সহজতর করে তোলে এবং একই ডোমেনের মধ্যে পূর্বনির্ধারিত কীগুলি দ্বারা বিভাগযুক্ত ভাগ করা স্টোরেজ প্রয়োগ করতে সহায়তা করে।

[অস্বীকৃতি] আমি ইউটিলিটির লেখক [/ অস্বীকৃতি]

উদাহরণ:

localDataStorage.set( 'key1', 'Belgian' )
localDataStorage.set( 'key2', 1200.0047 )
localDataStorage.set( 'key3', true )
localDataStorage.set( 'key4', { 'RSK' : [1,'3',5,'7',9] } )
localDataStorage.set( 'key5', null )

localDataStorage.get( 'key1' )   -->   'Belgian'
localDataStorage.get( 'key2' )   -->   1200.0047
localDataStorage.get( 'key3' )   -->   true
localDataStorage.get( 'key4' )   -->   Object {RSK: Array(5)}
localDataStorage.get( 'key5' )   -->   null

আপনি দেখতে পাচ্ছেন, আদিম মানগুলি সম্মানিত হয়।


1
এটি একটি উজ্জ্বল সংস্থান এবং ঠিক আমার যা প্রয়োজন। আমি অ্যাংুলার জেএসের সাথে আয়নিক অ্যাপ্লিকেশনগুলি করছি যেখানে আমাকে স্থানীয় স্টোরেজে কিছু জাভাস্ক্রিপ্ট অবজেক্টগুলি সংরক্ষণ করতে হবে এবং এখন পর্যন্ত আমি কেবল JSON.parse এবং JSON.stringify করে চলেছি, এবং তারা কাজ করছে, তবে এটি সক্ষম হওয়ার চেয়ে কিছুটা জটিল এই মত একটি ইউটিলিটি ব্যবহার করতে। আমি এটি চেষ্টা করতে যাচ্ছি।
এনমুটা

4

অন্য বিকল্পটি হ'ল একটি বিদ্যমান প্লাগইন ব্যবহার করা।

উদাহরণস্বরূপ পার্সিস্টো হ'ল একটি ওপেন সোর্স প্রকল্প যা লোকালস্টোরেজ / সেশন স্টোরেজকে একটি সহজ ইন্টারফেস সরবরাহ করে এবং ফর্ম ক্ষেত্রগুলির জন্য (ইনপুট, রেডিও বোতাম এবং চেকবক্স) অধ্যবসায়কে স্বয়ংক্রিয়ভাবে সরবরাহ করে।

ক্রমাগত বৈশিষ্ট্য

(অস্বীকৃতি: আমি লেখক।)


এখনও আমার রিডমি কাজ, কিন্তু আমার সংস্করণ নেই প্রয়োজন, jQuery এর, মনে হচ্ছে যেমন persisto, কিন্তু এটি jQuery এর উপাদান অবজেক্টস সঙ্গে তার আচরণ করার জন্য কোন বিকল্প প্রদান করে। এটি আরও বিভিন্ন jQuery অবজেক্টগুলিকে আরও পরিচালনা করতে এবং অবিরাম ডেটার মতো জিনিস বজায় রাখতে সহায়তা করার জন্য আমি এর সাথে আরও বেশি কাজ করার কারণে অদূর ভবিষ্যতে আরও যুক্ত করব। এছাড়াও, আরও সহজ সমাধান দেওয়ার চেষ্টা করার জন্য +1! এছাড়াও, এটি সমস্ত প্রচলিত পদ্ধতি ব্যবহার করে localStroage; এক্সপ্রেস: var lsh = new localStorageHelper(); lsh.setItem('bob', 'bill'); এছাড়াও ইভেন্টগুলি অন্তর্ভুক্ত।
SpYk3HH

4

আপনি স্ট্রিং হিসাবে বস্তু সংরক্ষণ করতে এজসন ব্যবহার করতে পারেন ।

আরও প্রকারের সমর্থন করতে ইজেএসন হ'ল জেএসওএন-এর একটি এক্সটেনশন। এটি সমস্ত JSON- নিরাপদ প্রকারকে সমর্থন করে পাশাপাশি:

  • তারিখ (জাভাস্ক্রিপ্ট Date)
  • বাইনারি (জাভাস্ক্রিপ্ট Uint8Arrayবা EJSON.newBinary ফলাফল )
  • ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি ( EJSON.addType দেখুন example উদাহরণস্বরূপ, মঙ্গো.অবজেক্টআইডি এভাবে প্রয়োগ করা হয়))

সমস্ত EJSON সিরিয়ালাইজেশন বৈধ JSON। উদাহরণস্বরূপ একটি তারিখ এবং একটি বাইনারি বাফারযুক্ত কোনও বস্তু EJSON এ সিরিয়ালযুক্ত হবে:

{
  "d": {"$date": 1358205756553},
  "b": {"$binary": "c3VyZS4="}
}

ইজসন ব্যবহার করে এখানে আমার লোকালস্টোরেজ র‍্যাপার

https://github.com/UziTech/storage.js

আমি আমার র‍্যাপারে নিয়মিত অভিব্যক্তি এবং ফাংশন সহ কিছু প্রকার যুক্ত করেছি


2

আমি কেবল 20 লাইন কোড দিয়ে এটির মতো ব্যবহারের অনুমতি দেওয়ার জন্য আরও একটি নমনীয় মোড়ক তৈরি করেছি:

localStorage.set('myKey',{a:[1,2,5], b: 'ok'});
localStorage.has('myKey');   // --> true
localStorage.get('myKey');   // --> {a:[1,2,5], b: 'ok'}
localStorage.keys();         // --> ['myKey']
localStorage.remove('myKey');

https://github.com/zevero/simpleWebstorage


2

টাইপস্ক্রিপ্ট ব্যবহারকারীদের জন্য টাইপ করা বৈশিষ্ট্য সেট করতে এবং পেতে ইচ্ছুক:

/**
 * Silly wrapper to be able to type the storage keys
 */
export class TypedStorage<T> {

    public removeItem(key: keyof T): void {
        localStorage.removeItem(key);
    }

    public getItem<K extends keyof T>(key: K): T[K] | null {
        const data: string | null =  localStorage.getItem(key);
        return JSON.parse(data);
    }

    public setItem<K extends keyof T>(key: K, value: T[K]): void {
        const data: string = JSON.stringify(value);
        localStorage.setItem(key, data);
    }
}

ব্যবহারের উদাহরণ :

// write an interface for the storage
interface MyStore {
   age: number,
   name: string,
   address: {city:string}
}

const storage: TypedStorage<MyStore> = new TypedStorage<MyStore>();

storage.setItem("wrong key", ""); // error unknown key
storage.setItem("age", "hello"); // error, age should be number
storage.setItem("address", {city:"Here"}); // ok

const address: {city:string} = storage.getItem("address");

2

https://github.com/adrianmay/rhaboo একটি স্থানীয় স্টোরেজ চিনির স্তর যা আপনাকে এই জাতীয় জিনিস লিখতে দেয়:

var store = Rhaboo.persistent('Some name');
store.write('count', store.count ? store.count+1 : 1);
store.write('somethingfancy', {
  one: ['man', 'went'],
  2: 'mow',
  went: [  2, { mow: ['a', 'meadow' ] }, {}  ]
});
store.somethingfancy.went[1].mow.write(1, 'lawn');

এটি JSON.stringify / পার্স ব্যবহার করে না কারণ এটি বড় অবজেক্টগুলিতে ভুল এবং ধীর হবে। পরিবর্তে, প্রতিটি টার্মিনাল মানটির নিজস্ব লোকাল স্টোরেজ এন্ট্রি থাকে।

আপনি সম্ভবত অনুমান করতে পারেন যে রাবু সম্পর্কে আমার কিছু থাকতে পারে।


1

এখানে কোডের কিছু এক্সটেনটেড ভার্সন @ বিডানট পোস্ট করেছেন

এটি বাস্তবায়নও করব স্থানীয় স্টোরেজ থেকে মুছে ফেলা মানটিও তার পরিবর্তে কীভাবে একটি গিটার এবং সেটার স্তর যুক্ত করতে হবে তা দেখায়

localstorage.setItem(preview, true)

তুমি লিখতে পারো

config.preview = true

ঠিক আছে এখানে গিয়েছিলেন:

var PT=Storage.prototype

if (typeof PT._setItem >='u') PT._setItem = PT.setItem;
PT.setItem = function(key, value)
{
  if (typeof value >='u')//..ndefined
    this.removeItem(key)
  else
    this._setItem(key, JSON.stringify(value));
}

if (typeof PT._getItem >='u') PT._getItem = PT.getItem;
PT.getItem = function(key)
{  
  var ItemData = this._getItem(key)
  try
  {
    return JSON.parse(ItemData);
  }
  catch(e)
  {
    return ItemData;
  }
}

// Aliases for localStorage.set/getItem 
get =   localStorage.getItem.bind(localStorage)
set =   localStorage.setItem.bind(localStorage)

// Create ConfigWrapperObject
var config = {}

// Helper to create getter & setter
function configCreate(PropToAdd){
    Object.defineProperty( config, PropToAdd, {
      get: function ()      { return (  get(PropToAdd)      ) },
      set: function (val)   {           set(PropToAdd,  val ) }
    })
}
//------------------------------

// Usage Part
// Create properties
configCreate('preview')
configCreate('notification')
//...

// Config Data transfer
//set
config.preview = true

//get
config.preview

// delete
config.preview = undefined

আচ্ছা আপনি এলিয়াস অংশটি ছিনিয়ে নিতে পারেন .bind(...)। তবে আমি কেবল এটি এনেছি কারণ এটি সম্পর্কে জেনে রাখা ভাল। সরল কেন get = localStorage.getItem;কাজ করে না তা জানতে আমাকে ঘন্টা সময় নিয়েছে


1

আমি এমন একটি জিনিস তৈরি করেছি যা বিদ্যমান স্টোরেজ অবজেক্টগুলিকে ভঙ্গ না করে তবে একটি মোড়ক তৈরি করে যাতে আপনি যা চান তা করতে পারেন। ফলাফলটি কোনও সাধারণ অবজেক্ট, কোনও পদ্ধতি নয়, কোনও বস্তুর মতো অ্যাক্সেস সহ।

আমি যে জিনিসটি তৈরি করেছি।

আপনি যদি 1 টি localStorageসম্পত্তি যাদু হতে চান :

var prop = ObjectStorage(localStorage, 'prop');

আপনার কয়েকটি প্রয়োজন হলে:

var storage = ObjectStorage(localStorage, ['prop', 'more', 'props']);

আপনি যা কিছু করেন তা propবা ভিতরে থাকা বস্তুগুলি storageস্বয়ংক্রিয়ভাবে সেভ হয়ে যাবে localStorage। আপনি সবসময় সত্যিকারের অবজেক্টের সাথে খেলছেন, যাতে আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

storage.data.list.push('more data');
storage.another.list.splice(1, 2, {another: 'object'});

এবং প্রতিটি নতুন বস্তুর ভিতরে একটি ট্র্যাক করা স্বয়ংক্রিয়ভাবে ট্র্যাক হয়ে যাবে।

খুব বড় ক্ষতি: এটি নির্ভর করে Object.observe()তাই এতে ব্রাউজারের খুব সীমাবদ্ধ সমর্থন রয়েছে। এবং দেখে মনে হচ্ছে না এটি শীঘ্রই যে কোনও সময় ফায়ারফক্স বা এজের জন্য আসবে।


1

আপনি স্ট্রিং ফর্ম্যাট ছাড়া কী মান সংরক্ষণ করতে পারবেন না ।

স্থানীয় সঞ্চয়স্থান কেবল / মানের জন্য স্ট্রিং ফর্ম্যাটকে সমর্থন করে।

এজন্য আপনার ডেটাটিকে অ্যারে বা অবজেক্ট যাই হোক না কেন স্ট্রিংয়ে রূপান্তর করা উচিত

লোকালস্টোরারে ডেটা সঞ্চয় করতে প্রথমে JSON.stringify () পদ্ধতি ব্যবহার করে স্ট্রিংফাই করুন

var myObj = [{name:"test", time:"Date 2017-02-03T08:38:04.449Z"}];
localStorage.setItem('item', JSON.stringify(myObj));

তারপরে আপনি যখন তথ্য পুনরুদ্ধার করতে চান, আপনাকে আবার স্ট্রিং টু অবজেক্টকে পার্স করতে হবে।

var getObj = JSON.parse(localStorage.getItem('item'));

আশা করি এটা সাহায্য করবে.


0

কোনও অবজেক্ট সংরক্ষণ করার জন্য, আপনি এমন একটি অক্ষর তৈরি করতে পারেন যা আপনি স্ট্রিং থেকে কোনও বস্তুর কাছে কোনও বস্তু পেতে (বুদ্ধিমান হতে পারে না) ব্যবহার করতে পারেন। উদাহরণ স্বরূপ

var obj = {a: "lol", b: "A", c: "hello world"};
function saveObj (key){
    var j = "";
    for(var i in obj){
        j += (i+"|"+obj[i]+"~");
    }
    localStorage.setItem(key, j);
} // Saving Method
function getObj (key){
    var j = {};
    var k = localStorage.getItem(key).split("~");
    for(var l in k){
        var m = k[l].split("|");
        j[m[0]] = m[1];
    }
    return j;
}
saveObj("obj"); // undefined
getObj("obj"); // {a: "lol", b: "A", c: "hello world"}

আপনি যদি সেই বস্তুটি বিভক্ত করার জন্য যে চিঠিটি ব্যবহার করেন সেটিকে ব্যবহার করেন এবং এইটি খুব পরীক্ষামূলক This


0

আমি চক্রীয় রেফারেন্সযুক্ত বস্তুগুলির সাথে এটি কাজ করার একটি উপায় খুঁজে পেয়েছি।

চক্রীয় রেফারেন্স সহ একটি বস্তু তৈরি করি।

obj = {
    L: {
        L: { v: 'lorem' },
        R: { v: 'ipsum' }
    },
    R: {
        L: { v: 'dolor' },
        R: {
            L: { v: 'sit' },
            R: { v: 'amet' }
        }
    }
}
obj.R.L.uncle = obj.L;
obj.R.R.uncle = obj.L;
obj.R.R.L.uncle = obj.R.L;
obj.R.R.R.uncle = obj.R.L;
obj.L.L.uncle = obj.R;
obj.L.R.uncle = obj.R;

JSON.stringifyবিজ্ঞপ্তিগত রেফারেন্সের কারণে আমরা এখানে করতে পারি না ।

circularUncle

LOCALSTORAGE.CYCLICJSONরয়েছে .stringifyএবং .parseঠিক স্বাভাবিকের মতো JSON, তবে বিজ্ঞপ্তিযুক্ত রেফারেন্স সহ অবজেক্টগুলির সাথে কাজ করে। ("ওয়ার্কস" অর্থ পার্স (স্ট্রিংফাই (ওজেক্ট)) এবং অবজেক্ট গভীর সমান এবং 'অভ্যন্তরীণ সমতা' এর অভিন্ন সেট রয়েছে)

তবে আমরা কেবল শর্টকাটগুলি ব্যবহার করতে পারি:

LOCALSTORAGE.setObject('latinUncles', obj)
recovered = LOCALSTORAGE.getObject('latinUncles')

তারপরে, recoveredনিম্নলিখিত অর্থে আপত্তি জানাতে "একই" হবে:

[
obj.L.L.v === recovered.L.L.v,
obj.L.R.v === recovered.L.R.v,
obj.R.L.v === recovered.R.L.v,
obj.R.R.L.v === recovered.R.R.L.v,
obj.R.R.R.v === recovered.R.R.R.v,
obj.R.L.uncle === obj.L,
obj.R.R.uncle === obj.L,
obj.R.R.L.uncle === obj.R.L,
obj.R.R.R.uncle === obj.R.L,
obj.L.L.uncle === obj.R,
obj.L.R.uncle === obj.R,
recovered.R.L.uncle === recovered.L,
recovered.R.R.uncle === recovered.L,
recovered.R.R.L.uncle === recovered.R.L,
recovered.R.R.R.uncle === recovered.R.L,
recovered.L.L.uncle === recovered.R,
recovered.L.R.uncle === recovered.R
]

এখানে বাস্তবায়ন হয় LOCALSTORAGE

LOCALSTORAGE = (function(){
  "use strict";
  var ignore = [Boolean, Date, Number, RegExp, String];
  function primitive(item){
    if (typeof item === 'object'){
      if (item === null) { return true; }
      for (var i=0; i<ignore.length; i++){
        if (item instanceof ignore[i]) { return true; }
      }
      return false;
    } else {
      return true;
    }
  }
  function infant(value){
    return Array.isArray(value) ? [] : {};
  }
  function decycleIntoForest(object, replacer) {
    if (typeof replacer !== 'function'){
      replacer = function(x){ return x; }
    }
    object = replacer(object);
    if (primitive(object)) return object;
    var objects = [object];
    var forest  = [infant(object)];
    var bucket  = new WeakMap(); // bucket = inverse of objects 
    bucket.set(object, 0);    
    function addToBucket(obj){
      var result = objects.length;
      objects.push(obj);
      bucket.set(obj, result);
      return result;
    }
    function isInBucket(obj){ return bucket.has(obj); }
    function processNode(source, target){
      Object.keys(source).forEach(function(key){
        var value = replacer(source[key]);
        if (primitive(value)){
          target[key] = {value: value};
        } else {
          var ptr;
          if (isInBucket(value)){
            ptr = bucket.get(value);
          } else {
            ptr = addToBucket(value);
            var newTree = infant(value);
            forest.push(newTree);
            processNode(value, newTree);
          }
          target[key] = {pointer: ptr};
        }
      });
    }
    processNode(object, forest[0]);
    return forest;
  };
  function deForestIntoCycle(forest) {
    var objects = [];
    var objectRequested = [];
    var todo = [];
    function processTree(idx) {
      if (idx in objects) return objects[idx];
      if (objectRequested[idx]) return null;
      objectRequested[idx] = true;
      var tree = forest[idx];
      var node = Array.isArray(tree) ? [] : {};
      for (var key in tree) {
        var o = tree[key];
        if ('pointer' in o) {
          var ptr = o.pointer;
          var value = processTree(ptr);
          if (value === null) {
            todo.push({
              node: node,
              key: key,
              idx: ptr
            });
          } else {
            node[key] = value;
          }
        } else {
          if ('value' in o) {
            node[key] = o.value;
          } else {
            throw new Error('unexpected')
          }
        }
      }
      objects[idx] = node;
      return node;
    }
    var result = processTree(0);
    for (var i = 0; i < todo.length; i++) {
      var item = todo[i];
      item.node[item.key] = objects[item.idx];
    }
    return result;
  };
  var console = {
    log: function(x){
      var the = document.getElementById('the');
      the.textContent = the.textContent + '\n' + x;
	},
	delimiter: function(){
      var the = document.getElementById('the');
      the.textContent = the.textContent +
		'\n*******************************************';
	}
  }
  function logCyclicObjectToConsole(root) {
    var cycleFree = decycleIntoForest(root);
    var shown = cycleFree.map(function(tree, idx) {
      return false;
    });
    var indentIncrement = 4;
    function showItem(nodeSlot, indent, label) {
      var leadingSpaces = ' '.repeat(indent);
      var leadingSpacesPlus = ' '.repeat(indent + indentIncrement);
      if (shown[nodeSlot]) {
        console.log(leadingSpaces + label + ' ... see above (object #' + nodeSlot + ')');
      } else {
        console.log(leadingSpaces + label + ' object#' + nodeSlot);
        var tree = cycleFree[nodeSlot];
        shown[nodeSlot] = true;
        Object.keys(tree).forEach(function(key) {
          var entry = tree[key];
          if ('value' in entry) {
            console.log(leadingSpacesPlus + key + ": " + entry.value);
          } else {
            if ('pointer' in entry) {
              showItem(entry.pointer, indent + indentIncrement, key);
            }
          }
        });
      }
    }
	console.delimiter();
    showItem(0, 0, 'root');
  };
  function stringify(obj){
    return JSON.stringify(decycleIntoForest(obj));
  }
  function parse(str){
    return deForestIntoCycle(JSON.parse(str));
  }
  var CYCLICJSON = {
    decycleIntoForest: decycleIntoForest,
    deForestIntoCycle : deForestIntoCycle,
    logCyclicObjectToConsole: logCyclicObjectToConsole,
    stringify : stringify,
    parse : parse
  }
  function setObject(name, object){
    var str = stringify(object);
    localStorage.setItem(name, str);
  }
  function getObject(name){
    var str = localStorage.getItem(name);
    if (str===null) return null;
    return parse(str);
  }
  return {
    CYCLICJSON : CYCLICJSON,
    setObject  : setObject,
    getObject  : getObject
  }
})();
obj = {
	L: {
		L: { v: 'lorem' },
		R: { v: 'ipsum' }
	},
	R: {
		L: { v: 'dolor' },
		R: {
			L: { v: 'sit' },
			R: { v: 'amet' }
		}
	}
}
obj.R.L.uncle = obj.L;
obj.R.R.uncle = obj.L;
obj.R.R.L.uncle = obj.R.L;
obj.R.R.R.uncle = obj.R.L;
obj.L.L.uncle = obj.R;
obj.L.R.uncle = obj.R;

// LOCALSTORAGE.setObject('latinUncles', obj)
// recovered = LOCALSTORAGE.getObject('latinUncles')
// localStorage not available inside fiddle ):
LOCALSTORAGE.CYCLICJSON.logCyclicObjectToConsole(obj)
putIntoLS = LOCALSTORAGE.CYCLICJSON.stringify(obj);
recovered = LOCALSTORAGE.CYCLICJSON.parse(putIntoLS);
LOCALSTORAGE.CYCLICJSON.logCyclicObjectToConsole(recovered);

var the = document.getElementById('the');
the.textContent = the.textContent + '\n\n' +
JSON.stringify(
[
obj.L.L.v === recovered.L.L.v,
obj.L.R.v === recovered.L.R.v,
obj.R.L.v === recovered.R.L.v,
obj.R.R.L.v === recovered.R.R.L.v,
obj.R.R.R.v === recovered.R.R.R.v,
obj.R.L.uncle === obj.L,
obj.R.R.uncle === obj.L,
obj.R.R.L.uncle === obj.R.L,
obj.R.R.R.uncle === obj.R.L,
obj.L.L.uncle === obj.R,
obj.L.R.uncle === obj.R,
recovered.R.L.uncle === recovered.L,
recovered.R.R.uncle === recovered.L,
recovered.R.R.L.uncle === recovered.R.L,
recovered.R.R.R.uncle === recovered.R.L,
recovered.L.L.uncle === recovered.R,
recovered.L.R.uncle === recovered.R
]
)
<pre id='the'></pre>


-2

স্থানীয় স্টোরেজ.সেটটাইম ('ব্যবহারকারীর', জেএসওএন.স্ট্রিংফাই (ব্যবহারকারী));

তারপরে এটি দোকান থেকে পুনরুদ্ধার করতে এবং আবার কোনও বস্তুতে রূপান্তর করতে:

var ব্যবহারকারী = JSON.parse (লোকালস্টোরেজ.জেটআইটেম ('ব্যবহারকারী'));

আমাদের যদি স্টোরের সমস্ত এন্ট্রি মুছতে হয় তবে আমরা সহজভাবে এটি করতে পারি:

localStorage.clear ();


3
এটি একটি 10 ​​বছরের পুরানো প্রশ্ন। আপনি কি মনে করেন যে আপনার উত্তরটি ইতিমধ্যে অন্যান্য উত্তরগুলির আওতায় নেই এমন কিছু যুক্ত করেছে?
ক্রিস্টোফার জনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.