(यह GitHub में मेरी लाइब्रेरी में जोड़ा गया है )
यहाँ चाक को फिर से लगाना! इनमें से किसी भी समाधान ने मेरी स्थिति के लिए काम नहीं किया। इसलिए, मैंने जल्दी से विल्सनपेज के उत्तर को सूचित किया । यह एक स्क्रीन प्रिंटिंग (कंसोल, या टेक्स्टफील्ड या जो भी हो) के लिए नहीं है। यह उन स्थितियों में ठीक काम करता है और ठीक उसी तरह काम करता है जैसे कि ओपी ने अनुरोध किया था alert
। यहाँ कई उत्तर alert
ओपी के अनुरोध के अनुसार उपयोग नहीं करते हैं । किसी भी तरह, यह डेटा परिवहन के लिए स्वरूपित है। इस संस्करण के रूप में एक बहुत ही परिणाम वापस करने के लिए लगता है toSource()
। मैंने परीक्षण नहीं किया है JSON.stringify
, लेकिन मुझे लगता है कि यह उसी चीज के बारे में है। यह संस्करण पॉली-फिल की तरह अधिक है ताकि आप इसे किसी भी वातावरण में उपयोग कर सकें। इस फ़ंक्शन का परिणाम एक मान्य जावास्क्रिप्ट ऑब्जेक्ट घोषणा है।
मुझे संदेह नहीं अगर ऐसा कुछ पहले से ही एसओ पर कहीं था, लेकिन यह पिछले जवाबों को खोजने के दौरान खर्च करने की तुलना में इसे कम करने के लिए छोटा था। और जब से मैंने इस बारे में खोजना शुरू किया, तब से यह सवाल Google पर मेरी सबसे बड़ी हिट थी; मुझे लगा कि इसे यहाँ लगाने से दूसरों को मदद मिल सकती है।
किसी भी तरह, इस फ़ंक्शन से परिणाम आपके ऑब्जेक्ट का एक स्ट्रिंग प्रतिनिधित्व होगा, भले ही आपकी ऑब्जेक्ट में ऑब्जेक्ट्स और सरणियाँ हों, और भले ही उन ऑब्जेक्ट्स या सरणियों में आगे भी एम्बेडेड ऑब्जेक्ट्स और सरणियाँ हों। (मैंने सुना है कि आप पीना पसंद करते हैं? इसलिए, मैंने आपकी कार को एक कूलर के साथ पंप किया। और फिर, मैंने आपके कूलर को एक कूलर के साथ पंप किया। इसलिए, आपका कूलर ठंडा होने पर भी पी सकता है।)
Arrays के []
बजाय के साथ संग्रहीत किया जाता है {}
और इस प्रकार कुंजी / मूल्य जोड़े, बस मूल्यों नहीं है। नियमित सरणियों की तरह। इसलिए, वे सरणियों की तरह बनाये जाते हैं।
इसके अलावा, सभी स्ट्रिंग (प्रमुख नामों सहित) उद्धृत किए गए हैं, यह तब तक आवश्यक नहीं है जब तक कि उन तारों में विशेष वर्ण (जैसे कि कोई स्थान या स्लैट) न हों। लेकिन, मुझे यह महसूस नहीं हुआ कि मैं केवल कुछ उद्धरणों को हटाने के लिए इसका पता लगाऊंगा जो कि अभी भी ठीक काम करेंगे।
इसके परिणामस्वरूप स्ट्रिंग eval
को एक var थ्रू स्ट्रिंग हेरफेर में डंपिंग के साथ या बस इस्तेमाल किया जा सकता है । इस प्रकार, पाठ से अपनी वस्तु को फिर से बनाना।
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
एक भयानक उदाहरण है। एक के लिए, FF उपयोग करते समय एक खाली ऑब्जेक्ट स्ट्रिंग प्रिंट करता है toSource
। और ऊपर फ़ंक्शन का उपयोग करते समय, एफएफ क्रैश हो जाता है SecurityError: The operation is insecure.
। और Chrome क्रैश हो जाएगा Uncaught RangeError: Maximum call stack size exceeded
। स्पष्ट रूप से, document.body
स्ट्रिंग में परिवर्तित होने के लिए नहीं था। क्योंकि इसकी या तो बहुत बड़ी है, या कुछ संपत्तियों तक पहुंचने के लिए सुरक्षा नीति के खिलाफ है। जब तक, मैं यहाँ कुछ गड़बड़ कर दिया, बताओ!