数値や文字列、関数や配列など様々な型のプロパティを持つオブジェクトをテキストに変換するプログラムを作成しました。
作成したテキストをeval関数に渡すと元通りのオブジェクトが作成できます。
ただし以下のような、循環参照を含むオブジェクトを渡すと無限ループしてしまいます。
作成したテキストをeval関数に渡すと元通りのオブジェクトが作成できます。
ただし以下のような、循環参照を含むオブジェクトを渡すと無限ループしてしまいます。
[循環参照を含むオブジェクトの例] obj = {a:0, b:1} obj.c = obj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<job> | |
<script> | |
forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}} | |
;(function(){ | |
var rYn=/\n/g, rYr=/\r/g, rDQ=/[""]/g, rArr=/Array/, rDat=/Date/, YnYt='\n\t', date_='date', num='number', boo='boolean', und='undefined', str='string', obj='object', nul='null', fun='function', DQ='"', YY='\\\\', YYn='\\n', YYr='\\r', YYdq='\\"', headF='(function(){', varObj='\nvar obj = ', footF='\n\treturn obj\n})()', arr='[]', newDate='new Date("', datEnd='")' | |
var str0='\nobj[', str1='] = ', len0='', str2='{', str3='\n}', comma=',', Yn='\n', str4=' : ' | |
var forIn0=function(o){var s=len0; forIn(o, function(n,v){s+= str0 + me(n) + str1 + me(v)}); return s} | |
var forIn1=function(o){var s=len0; forIn(o, function(n,v){s+= (s?comma:len0) + Yn + me(n) + str4 + me(v)}); return s} | |
var funcインデント調整=function(fun){ var str=fun.toString(), 最終行=str.match(/([\t ]*)\}$/)[1], reg=new RegExp('\\n'+最終行,'g'); return str.replace(reg,'\n') } | |
var me = obj2txt = function(o){ | |
if(!o && o!=0 && o!=null && typeof(o)!=date_){ return } | |
switch(typeof(o)){ | |
case num:case boo:case und:return o | |
case str:return DQ + o.replace(/\\/g,YY).replace(rYn,YYn).replace(rYr,YYr).replace(rDQ,YYdq) + DQ | |
case obj: | |
if(o==null){ return nul } | |
if(o.constructor.toString().match(rArr)){ | |
return headF + (varObj + arr + forIn0(o)).replace(rYn,YnYt) + footF | |
}else if(o.constructor.toString().match(rDat)){ | |
return headF + (varObj + newDate + o + datEnd + forIn0(o)).replace(rYn,YnYt) + footF | |
}else{ | |
return str2 + forIn1(o).replace(rYn,YnYt) + str3 | |
} | |
case fun: | |
return (headF + (varObj + funcインデント調整(o) + forIn0(o)).replace(rYn,YnYt) + footF) | |
case date_: | |
return headF + varObj + newDate + o + datEnd + forIn0(o) + footF | |
} | |
} | |
})(); | |
obj = { | |
a:function(b,c){return c-d}, | |
b:new Date(), | |
c:1, | |
d:"aiueo'\"", | |
e:[1,2,3] | |
} | |
obj.e.f = 456 | |
str = obj2txt(obj) | |
eval('obj0 = '+str) | |
WScript.Echo(str + '\n\n' + obj2txt(obj0)) | |
</script> | |
</job> |
0 件のコメント:
コメントを投稿