সেশনসটোরেজে জাভাস্ক্রিপ্ট অবজেক্টগুলি সংরক্ষণ করুন


152

সেশনসটরেজ এবং লোকালস্টোরেশন ওয়েব / ব্রাউজারে কী / মান জোড়া সংরক্ষণ করতে দেয়। মানটি অবশ্যই একটি স্ট্রিং হতে হবে এবং জেএস বস্তুগুলি সংরক্ষণ করা তুচ্ছ নয়।

var user = {'name':'John'};
sessionStorage.setItem('user', user);
var obj = sessionStorage.user; // obj='[object Object]' Not an object

আজকাল, আপনি জেএসএনে অবজেক্টগুলিকে সিরিয়ালাইজ করে এই সীমাবদ্ধতা এড়াতে পারবেন এবং তারপরে অবজেক্টগুলি পুনরুদ্ধার করতে তাদের ডিসরিয়ালাইজ করুন। তবে স্টোরেজ এপিআই সর্বদা পদ্ধতি setItemএবং getItemপদ্ধতিগুলির মধ্য দিয়ে যায় ।

sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.getItem('user')); // An object :D

আমি কি এই সীমাবদ্ধতা এড়াতে পারি?

আমি এই জাতীয় কিছু কার্যকর করতে চাই:

sessionStorage.user.name; // 'John'
sessionStorage.user.name = 'Mary';
sessionStorage.user.name // 'Mary'

আমি কলগুলি বন্ধ করার জন্য পদ্ধতিগুলি defineGetterএবং defineSetterপদ্ধতিগুলি চেষ্টা করেছি তবে এটি একটি ক্লান্তিকর কাজ, কারণ আমাকে সমস্ত বৈশিষ্ট্য সংজ্ঞায়িত করতে হবে এবং আমার লক্ষ্য ভবিষ্যতের বৈশিষ্ট্যগুলি জানার নয়।


1
আমি এটা ভেবেছিলাম। আমি মনে করি অনেক লোক আছে। তবে আমি মনে করি না গেটর এবং সেটার পদ্ধতিগুলি খুব বেশি বোঝা। BTW; আপনি জাভাস্ক্রিপ্টের সাথে সিরিয়ালাইজ এবং পার্স করতে পারেন এবং এমএস অবশেষে অন্য সবার মতো একই স্ট্যান্ডার্ড অবজেক্টগুলিকে সমর্থন করে। JSON এবং jQuery এর মতো প্যাকেজগুলির প্রয়োজনের দিন দ্রুত শেষ হচ্ছে।
রজার এফ গে গে

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

5
"আমি কি এই সীমাবদ্ধতা এড়াতে পারি?" একটি প্রশ্নের মতো মনে হচ্ছে
21

1
ভাল সীমাবদ্ধতা বা না, এই প্রশ্নটি আমাকে একটি সমস্যার সমাধান করতে সহায়তা করেছে, তাই ধন্যবাদ।
ম্যাট ওয়েস্ট

উত্তর:


19

হয় আপনি ওয়েব স্টোরেজ এপিআই দ্বারা সরবরাহিত অ্যাকসেসরগুলি ব্যবহার করতে পারেন বা আপনি একটি মোড়ক / অ্যাডাপ্টার লিখতে পারেন। DefineGetter / DefineSetter নিয়ে আপনার বিবৃত সমস্যা থেকে মনে হচ্ছে একটি মোড়ক / অ্যাডাপ্টারের লেখা আপনার পক্ষে খুব বেশি কাজ।

আমি সত্যি বলতে কি আপনাকে জানাতে জানি না। সম্ভবত আপনি একটি "হাস্যকর সীমাবদ্ধতা" কী তা সম্পর্কে আপনার মতামতটি পুনর্বিবেচনা করতে পারেন। ওয়েব স্টোরেজ এপিআই হ'ল এটি কী, মান / মূল্য সঞ্চয় supposed


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

2
জেএসএন যদি পর্যাপ্ত না হয় তবে আপনি সর্বদা নিজের অবজেক্ট সিরিয়ালাইজেশন পদ্ধতিগুলি লিখতে পারেন।
রায়ান ওল্ডস

110

আপনি কি নিজের অবজেক্টকে 'স্ট্রিংফাইজ' করতে পারবেন না ... তারপরে আপনার অবজেক্টের sessionStorage.setItem()স্ট্রিং প্রতিনিধিত্ব সংরক্ষণ করতে ব্যবহার করুন ... তারপরে যখন আপনার এটির প্রয়োজন হবে sessionStorage.getItem()এবং তারপরে ব্যবহার করুন$.parseJSON() এটি আবার বের করার জন্য করেন?

কাজের উদাহরণ http://jsfiddle.net/pKXMa/


এটি আমার পক্ষে কাজ করে। Working .parseJSON ()
ওলাফুর

ওয়েব অপি প্রমাণীকরণের মতো কিছু সিস্টেম অবজেক্ট {সম্পত্তিOneWithoutQuotes আকারে বস্তুগুলি ফেরত দেয়: "<value1>", ... সম্পত্তিNWithoutQuotes: "<valueN>"} যা "স্ট্রিংফাই" মাধ্যমে যেতে হবে। যদি একাধিক উত্স থাকে তবে ডেটা মানক করার জন্য স্ট্রিংফাই ব্যবহার করা ভাল।
জেলগাব

এটি খুব ভাল উত্তর। জেনসন.স্ট্রিংফাই () অবজেক্টটি সিরিয়ালাইজ করতে এবং সেশনসটোরেজে সঞ্চয় করতে ব্যবহার করা ভাল। তারপরে, এটি বস্তুটি পেতে স্ট্রিংটিকে ডি-সিরিয়ালায়িত করতে $ .parseJSON () ব্যবহার করে।
থমাস.বেঞ্জ

102

সেশনসটোরেজে সেটটি আইটেম কল করার আগে সমাধানটি হ'ল অবজেক্টটিকে স্ট্রিংফাই করা।

var user = {'name':'John'};
sessionStorage.setItem('user', JSON.stringify(user));
var obj = JSON.parse(sessionStorage.user);

সমাধানটি সংযুক্ত না করার জন্য আপনাকে ধন্যবাদ
লুক-অলস্টহর্ন

12

এটি একটি গতিশীল সমাধান যা অবজেক্টস সহ সমস্ত মান ধরণের সাথে কাজ করে:

class Session extends Map {
  set(id, value) {
    if (typeof value === 'object') value = JSON.stringify(value);
    sessionStorage.setItem(id, value);
  }

  get(id) {
    const value = sessionStorage.getItem(id);
    try {
      return JSON.parse(value);
    } catch (e) {
      return value;
    }
  }
}

তারপরে:

const session = new Session();

session.set('name', {first: 'Ahmed', last : 'Toumi'});
session.get('name');

5

ব্যবহারের ক্ষেত্রে:

 sesssionStorage.setObj(1,{date:Date.now(),action:'save firstObject'});
 sesssionStorage.setObj(2,{date:Date.now(),action:'save 2nd object'}); 
 //Query first object
  sesssionStorage.getObj(1)
  //Retrieve date created of 2nd object
  new Date(sesssionStorage.getObj(1).date)

এপিআই

Storage.prototype.setObj = function(key, obj) {

        return this.setItem(key, JSON.stringify(obj))
    };
    
    Storage.prototype.getObj = function(key) {
        return JSON.parse(this.getItem(key))
    };

4
আমি ভেবেছিলাম জাভাস্ক্রিপ্টের সেরা অনুশীলনগুলির মধ্যে একটি হ'ল প্রোটোটাইপ অবজেক্ট যা আপনার নিজের নয়। Storage.prototype.setObj ব্যবহার করা খারাপ ধারণা বলে মনে হচ্ছে।
ব্রিটিজথের

3
কেবল বাধ্যতামূলকভাবে যুক্ত করা .. আপনি ব্রাউজারটি সমর্থন করে কিনা তা পরীক্ষা না করে আপনি এই প্রোটোটাইপ কোডটি যুক্ত না করেছেন - এবং একচেটিয়াভাবে নির্ভর করুন তা নিশ্চিত করুন সঞ্চয়স্থান:if (typeof (Storage) !== "undefined"){ /* browser supports it */ }
জোব্রোকহাউস

4

সেশন স্টোরেজ একটি স্বেচ্ছাসেবী অবজেক্টটিকে সমর্থন করতে পারে না কারণ এতে ফাংশন লিটারাল (পড়ার বন্ধ) থাকতে পারে যা কোনও পৃষ্ঠা পুনরায় লোডের পরে পুনর্গঠন করা যায় না।



2

আপনি স্টোর লাইব্রেরিও ব্যবহার করতে পারেন যা ক্রসব্রোজার সক্ষমতার সাথে এটি আপনার জন্য সম্পাদন করে।

উদাহরণ:

// Store current user
store.set('user', { name:'Marcus' })

// Get current user
store.get('user')

// Remove current user
store.remove('user')

// Clear all keys
store.clearAll()

// Loop over all stored values
store.each(function(value, key) {
    console.log(key, '==', value)
})

0

আপনি সেশন স্টোরেজ থেকে অবজেক্টটি সংরক্ষণ এবং পুনরুদ্ধারের জন্য দুটি মোড়কের পদ্ধতি তৈরি করতে পারেন।

function saveSession(obj) {
  sessionStorage.setItem("myObj", JSON.stringify(obj));
  return true;
}

function getSession() {
  var obj = {};
  if (typeof sessionStorage.myObj !== "undefined") {
    obj = JSON.parse(sessionStorage.myObj);
  }
  return obj;
}

এটি এর মতো ব্যবহার করুন: - অবজেক্ট পান, কিছু ডেটা পরিবর্তন করুন এবং ফিরে সংরক্ষণ করুন।

var obj = getSession();

obj.newProperty = "Prod"

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