(මෙය GitHub හි මගේ පුස්තකාලයට එක් කර ඇත )
මෙහි රෝදය ප්රතිනිර්මාණය කිරීම! මෙම විසඳුම් කිසිවක් මගේ තත්වය සඳහා සාර්ථක වූයේ නැත. ඒ නිසා, මම ඉක්මනින් විල්සන්ගේ පිළිතුරට උපදෙස් දුන්නා. මෙය තිරයට මුද්රණය කිරීම සඳහා නොවේ (කොන්සෝලය, හෝ පෙළ ක්ෂේත්රය හෝ වෙනත් ඕනෑම දෙයක් හරහා). එම අවස්ථාවන්හිදී එය හොඳින් ක්රියාත්මක වන අතර OP ඉල්ලා ඇති ආකාරයටම හොඳින් ක්රියාත්මක වේ alert
. alert
OP ඉල්ලූ පරිදි මෙහි බොහෝ පිළිතුරු ආමන්ත්රණය නොකරයි . කෙසේ වෙතත්, එය දත්ත ප්රවාහනය සඳහා සංයුති කර ඇත. මෙම අනුවාදය සමාන ප්රති result ලයක් ලබා දෙන බව පෙනේ toSource()
. මම එරෙහිව පරීක්ෂාවට ලක් කර නැත JSON.stringify
, නමුත් මම සිතන්නේ මෙය එකම දෙයකි. මෙම අනුවාදය ඔබට ඕනෑම පරිසරයක භාවිතා කළ හැකි වන පරිදි පොලි ෆිල් එකක් වැනි ය. මෙම ශ්රිතයේ ප්රති result ලය වලංගු ජාවාස්ක්රිප්ට් වස්තු ප්රකාශයකි.
මේ වගේ දෙයක් දැනටමත් SO හි කොතැනක හෝ තිබේදැයි මට සැක නැත, නමුත් අතීත පිළිතුරු සෙවීමට ටික වේලාවක් ගත කරනවාට වඩා එය සෑදීම කෙටි විය. මම මේ ගැන සෙවීම ආරම්භ කරන විට මෙම ප්රශ්නය ගූගල් හි මගේ ඉහළම පහර වූ බැවින්; මම හිතුවා ඒක මෙතනට දාන්න අනිත් අයට උදව් වෙයි කියලා.
කෙසේ වෙතත්, මෙම ශ්රිතයේ ප්රති result ලය වනුයේ ඔබේ වස්තුව වස්තූන් හා අරා කාවැදී තිබුණත්, එම වස්තූන් හෝ අරා තව දුරටත් කාවැද්දූ වස්තූන් හා අරා තිබුණත් ඔබේ වස්තුවෙහි තන්තු නිරූපණයකි. (ඔබ බොන්න කැමති බව මට ඇසුණාද? ඉතින්, මම ඔබේ මෝටර් රථය සිසිලන යන්ත්රයකින් තල්ලු කළෙමි. ඉන්පසු මම ඔබේ සිසිලකය සිසිලනකාරකයක් සමඟ ගැසුවෙමි. එබැවින් සිසිල්ව සිටියදී ඔබේ සිසිලන පානය කළ හැකිය.)
අරා []
වෙනුවට ගබඩා කර ඇති {}
අතර එමඟින් යතුරු / අගය යුගල, අගයන් පමණක් නොමැත. සාමාන්ය අරා වගේ. එමනිසා, ඒවා අරා මෙන් නිර්මාණය වේ.
එසේම, සියලුම නූල් (යතුරු නම් ඇතුළුව) උපුටා දක්වා ඇත, එම නූල් වලට විශේෂ අක්ෂර (අවකාශයක් හෝ කප්පාදුවක් වැනි) නොමැති නම් මෙය අවශ්ය නොවේ. එහෙත්, සමහර විට උපුටා දැක්වීම් ඉවත් කිරීම සඳහා මෙය හඳුනා ගැනීමට මට දැනුනේ නැත.
මෙහි eval
ප්රති string ලයක් ලෙස භාවිතා කළ හැකි නූල භාවිතා කළ හැකිය. මේ අනුව, පෙළෙන් ඔබේ වස්තුව නැවත නිර්මාණය කිරීම.
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());
ප්රති ult ලය:
{'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.
. තවද ක්රෝම් බිඳ වැටෙනු ඇත Uncaught RangeError: Maximum call stack size exceeded
. පැහැදිලිවම, document.body
නූල් බවට පරිවර්තනය කිරීමට අදහස් නොකෙරුණි. මන්ද එය එක්කෝ විශාල හෝ ආරක්ෂක ප්රතිපත්තියට එරෙහිව ඇතැම් දේපලවලට ප්රවේශ වීමට නොහැකි බැවිනි. මම මෙහි යමක් අවුල් කළොත් මිස කියන්න!