(এটি গিটহাবের আমার লাইব্রেরিতে যুক্ত করা হয়েছে )
এখানে চাকা পুনর্নবীকরণ! এই সমাধানগুলির কোনওটিই আমার পরিস্থিতির পক্ষে কাজ করেনি। সুতরাং, আমি দ্রুত উইলসনপেজের উত্তর ডক্টর করেছি । এটি স্ক্রিনে মুদ্রণের জন্য নয় (কনসোল, বা টেক্সটফিল্ড বা যেকোনো কিছু দিয়ে)। এটি সেই পরিস্থিতিতে ঠিকঠাক কাজ করে এবং ওপি যেমন অনুরোধ করেছিল ঠিক তেমন কাজ করে alert
। alert
ওপির অনুরোধ হিসাবে অনেক উত্তর এখানে সম্বোধন করে না । যাইহোক, এটি তথ্য পরিবহনের জন্য ফর্ম্যাট করা আছে। এই সংস্করণটি খুব অনুরূপ ফলাফল হিসাবে ফিরে আসবে বলে মনে হচ্ছে toSource()
। আমি এর বিরুদ্ধে পরীক্ষা JSON.stringify
করিনি, তবে আমি ধরে নিই এটি একই জিনিস সম্পর্কে। এই সংস্করণটি একটি পলি-ফিলের মতো যাতে আপনি এটি কোনও পরিবেশে ব্যবহার করতে পারেন। এই ফাংশনের ফলাফলটি একটি বৈধ জাভাস্ক্রিপ্ট অবজেক্ট ঘোষণা।
এরকম কিছু ইতিমধ্যে কোথাও কোথাও ছিল কিনা তা নিয়ে আমি সন্দেহ করব না, তবে পূর্ববর্তী উত্তরগুলি অনুসন্ধান করার জন্য কিছুটা ব্যয় করার চেয়ে এটি তৈরি করা কেবল ছোট ছিল। এবং যেহেতু এই প্রশ্নটি গুগলে আমার শীর্ষে ছিল যখন আমি এই সম্পর্কে অনুসন্ধান শুরু করেছি; আমি অনুভব করেছি এটি এখানে রেখে অন্যকে সাহায্য করতে পারে।
যাইহোক, এই ফাংশনটি থেকে প্রাপ্ত ফলাফলটি আপনার অবজেক্টের একটি স্ট্রিং প্রতিনিধিত্ব করবে, এমনকি যদি আপনার অবজেক্টে বস্তু এবং অ্যারে এম্বেড থাকে এবং এমনকি যদি সেগুলি বা অ্যারেগুলিতে আরও এম্বেড করা অবজেক্ট এবং অ্যারে থাকে। (আমি শুনেছি যে আপনি পান করতে চান? সুতরাং, আমি আপনার গাড়িটি একটি কুলার দিয়ে ফুটিয়েছি And এবং তারপরে, আমি আপনার শীতলটি একটি শীতল দিয়ে ফুটিয়েছি So সুতরাং, আপনার শীতল পান করতে পারে, আপনার শীতল হওয়ার সময়))
অ্যারেগুলির []
পরিবর্তে সংরক্ষণ করা হয় {}
এবং এর ফলে কী / মান জোড়া থাকে না, কেবল মান থাকে। নিয়মিত অ্যারেগুলির মতো। অতএব, তারা অ্যারের মতো তৈরি হয়।
এছাড়াও, সমস্ত স্ট্রিং (মূল নামগুলি সহ) উদ্ধৃত করা হয়েছে, যদি না এই স্ট্রিংগুলির বিশেষ অক্ষর (স্পেস বা স্ল্যাশের মতো) না থাকে তবে এটি প্রয়োজনীয় নয়। তবে, আমি এমন কিছু উদ্ধৃতি সরিয়ে ফেলতে এটি সনাক্ত করার মতো মনে করি নি যা অন্যথায় এখনও ভাল কাজ করবে।
এই ফলস্বরূপ স্ট্রিংটি তারপরে eval
স্ট্রিং ম্যানিপুলেশনের মাধ্যমে কোনও ভারে ডাম্প করে বা ব্যবহার করা যেতে পারে । সুতরাং, পাঠ্য থেকে আপনার বস্তুটি আবার তৈরি করুন
function ObjToSource(o){
if (!o) return 'null';
var k="",na=typeof(o.length)=="undefined"?1:0,str="";
for(var p in o){
if (na) k = "'"+p+ "':";
if (typeof o[p] == "string") str += k + "'" + o[p]+"',";
else if (typeof o[p] == "object") str += k + ObjToSource(o[p])+",";
else str += k + o[p] + ",";
}
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
আমি যদি এগুলি সমস্ত গোলযোগ করি তবে আমাকে জানান, আমার পরীক্ষায় ভাল কাজ করে। এছাড়াও, টাইপ সনাক্ত করার জন্য আমি একমাত্র উপায়টির array
উপস্থিতি যাচাই করাই ছিল length
। যেহেতু জাভাস্ক্রিপ্ট আসলে অ্যারেগুলিকে বস্তু হিসাবে সঞ্চয় করে, আমি আসলে টাইপের জন্য পরীক্ষা করতে পারি না array
(এ জাতীয় কোনও ধরণের নেই!)। অন্য কেউ যদি এর থেকে আরও ভাল উপায় জানেন তবে আমি এটি শুনতে পছন্দ করব। কারণ, যদি আপনার অবজেক্টেরও কোনও সম্পত্তি নামকরণ করা থাকে length
তবে এই ফাংশনটি ভুল করে এটি অ্যারের হিসাবে বিবেচনা করবে।
সম্পাদনা: নাল মূল্যবান বস্তুগুলির জন্য চেক যুক্ত করা হয়েছে। ধন্যবাদ ব্রুক অ্যাডামস
সম্পাদনা: নীচে অসীম পুনরাবৃত্ত বস্তু মুদ্রণ করতে সক্ষম হতে স্থির ফাংশন। এটি toSource
এফএফ হিসাবে একই মুদ্রণ করে না কারণ toSource
একসময় অসীম পুনরাবৃত্তি মুদ্রণ করবে, যেখানে এই ফাংশনটি তত্ক্ষণাত এটি হত্যা করবে। এই ফাংশনটি উপরেরটির চেয়ে ধীর গতিতে চলেছে, সুতরাং উপরের ফাংশনটি সম্পাদনা করার পরিবর্তে আমি এখানে এটি যুক্ত করছি, আপনি যদি অন্য কোথাও নিজের সাথে সংযুক্ত বস্তুগুলি পাস করার পরিকল্পনা করেন তবে এটি কেবল তখনই প্রয়োজনীয়।
const ObjToSource=(o)=> {
if (!o) return null;
let str="",na=0,k,p;
if (typeof(o) == "object") {
if (!ObjToSource.check) ObjToSource.check = new Array();
for (k=ObjToSource.check.length;na<k;na++) if (ObjToSource.check[na]==o) return '{}';
ObjToSource.check.push(o);
}
k="",na=typeof(o.length)=="undefined"?1:0;
for(p in o){
if (na) k = "'"+p+"':";
if (typeof o[p] == "string") str += k+"'"+o[p]+"',";
else if (typeof o[p] == "object") str += k+ObjToSource(o[p])+",";
else str += k+o[p]+",";
}
if (typeof(o) == "object") ObjToSource.check.pop();
if (na) return "{"+str.slice(0,-1)+"}";
else return "["+str.slice(0,-1)+"]";
}
টেস্ট:
var test1 = new Object();
test1.foo = 1;
test1.bar = 2;
var testobject = new Object();
testobject.run = 1;
testobject.fast = null;
testobject.loop = testobject;
testobject.dup = test1;
console.log(ObjToSource(testobject));
console.log(testobject.toSource());
ফলাফল:
{'run':1,'fast':null,'loop':{},'dup':{'foo':1,'bar':2}}
({run:1, fast:null, loop:{run:1, fast:null, loop:{}, dup:{foo:1, bar:2}}, dup:{foo:1, bar:2}})
দ্রষ্টব্য: মুদ্রণের চেষ্টা করা document.body
একটি ভয়ানক উদাহরণ। একটির জন্য, এফএফ ব্যবহার করার সময় কেবল একটি খালি অবজেক্ট স্ট্রিং প্রিন্ট করে toSource
। এবং উপরের ফাংশনটি ব্যবহার করার সময়, এফএফ ক্র্যাশ হয়ে যায় SecurityError: The operation is insecure.
। এবং ক্রোম ক্রাশ হবে Uncaught RangeError: Maximum call stack size exceeded
। স্পষ্টতই, document.body
স্ট্রিংতে রূপান্তরিত করার অর্থ ছিল না। কারণ এটি হয় খুব বড়, বা নির্দিষ্ট সম্পত্তি অ্যাক্সেস করার জন্য সুরক্ষা নীতির বিরুদ্ধে। যদি না, আমি এখানে কিছু গণ্ডগোল করেছি, বলুন!