Страниц (5): [1] 2 3 4 5 » |
|
Без описания |
Поиск в теме | Версия для печати |
kr12 |
Отправлено: 11 Сентября, 2005 - 07:26:51
|
Member
Покинул форум
Сообщений всего: 136
Дата рег-ции: Март 2005
Карма 0
|
Вот функции, кодирующие многомерный элемент в строку и восстанавливающие. Есть 2 проблеммы:
1. Функция codeFMas изменяет исходный массив, хотя по моему бы не должна
2. Почему tmpArr доступен вне функции?
Примечание: можно было обойтись без eval, но о методе slice() и др. я прочитал только недавно .
CODE:
<script>
function crMass(name,a,b,c,d){ //-размерность массива
eval(name + " = new Array()")
for(var i=-1;i<a;i++){
eval(name+"["+i+"] = new Array()")
for(var i1=-1;i1<b;i1++){
eval(name+"["+i+"]["+i1+"] = new Array()")
for(var i2=-1;i2<=c;i2++){
eval(name+"["+i+"]["+i1+"]["+i2+"] = new Array()")
eval(name+"["+i+"]["+i1+"]["+i2+"] = '"+i+""+i1+""+i2+"'") //debag
for(var i3=-1;i3<d;i3++){
eval(name+"["+i+"]["+i1+"]["+i2+"]["+i3+"] = new Array()")
}
}
}
}
}
function codeFMas(name,x,x1,x2){ //x0=',' ! (x,x1,x2 = '#' '^' '@' или др)
this.tmpArr=eval(name+'.slice()')
for(var i=0;this.tmpArr[i]!=undefined;i++){
for(var i1=0;this.tmpArr[i][i1]!=undefined;i1++){
for(var i2=0;this.tmpArr[i][i1][i2]!=undefined;i2++){
for(var i3=0;this.tmpArr[i][i1][i2][i3]!=undefined;i3++){}
this.tmpArr[i][i1][i2][i3]=x2
}
this.tmpArr[i][i1][i2]=x1
}
this.tmpArr[i][i1]=x
}
return this.tmpArr;
}
function decodeFMas(var1,name,x,x1,x2){ //var1 декодируется в массив name; x,x1,x2 = '#' '^' '@'
a1='';a2='';
eval(name + " = new Array()")
eval(name + " = '"+var1+"'.split('"+x+",')")
for(var i=0;eval(name + "["+i+"]")!=undefined;i++){
if(eval(name + "["+i+"]").indexOf(x1)!=-1){
a1="["+'i1'+"]"
tmpp=eval(name+"["+i+"]"); document.write(tmpp+'<BR>')
eval(name+"["+i+"] = new Array()")
eval(name+"["+i+"]=tmpp.substring(0,tmpp.lastIndexOf(',')).split('"+x1+",')")
}
for(var i1=0;eval(name+"["+i+"]"+a1)!=undefined;i1++){
if(eval(name+"["+i+"]"+a1).indexOf(x2)!=-1){
a2="["+'i2'+"]";
tmpp=eval(name+"["+i+"]"+a1)
eval(name+"["+i+"]"+a1+" = new Array()")
eval(name+"["+i+"]"+a1+" = tmpp.substring(0,tmpp.lastIndexOf(',')).split('"+x2+",')")
}
for(var i1=0;eval(name+"["+i+"]"+a1+a2)!=undefined;i1++){
if(eval(name+"["+i+"]"+a1+a2).indexOf(',')!=-1){
tmpp=eval(name+"["+i+"]"+a1+a2)
eval(name+"["+i+"]"+a1+a2+" = new Array()")
eval(name+"["+i+"]"+a1+a2+" = tmpp.substring(0,tmpp.lastIndexOf(',')).split(',')")
}}
}
}
}
crMass('aa',3,3,6)
//aa[2]='s';aa[0][0][0]=0;aa[0][0][1]=1;aa[1][0]=10;aa[1][2][2]=21
document.write('массив<a style="position:absolute;left:160px">'+aa+'</a><BR>')
aa1=codeFMas('aa','#','^','@')
document.write('измененный массив<a style="position:absolute;left:160px">'+aa+'</a><BR>')
document.write('временный массив<a style="position:absolute;left:160px">'+tmpArr+'</a><BR>')
document.write('строка<a style="position:absolute;left:160px">'+aa1+'</a><BR>')
decodeFMas(aa1,'aa2','#','^','@')
document.write('восстановлен массив<a style="position:absolute;left:160px">'+aa2+'</a><BR>')
document.write('<BR><BR>'+aa2[2])
document.write('<BR><BR>'+aa2[2][2][0])
</script>
P.S.: может быть можно это сделать как-то проще и для массивов любой размерности? |
|
|
RaZoR |
Отправлено: 12 Сентября, 2005 - 08:45:28
|
Full Member
Покинул форум
Сообщений всего: 225
Дата рег-ции: Март 2005
Откуда: Оренбург
Карма 0
|
вот аналог функции serialize:
CODE:<script>
var arrSerialized = new Object();
var _maxRecursionLevels = 1000;
var _currentRecursionLevel = 0;
function addslashes(sString)
{
return sString.replace(/\'/g, "\'");
}
function serialize(oInput)
{
if (_currentRecursionLevel > _maxRecursionLevels) return 'N;';
if (oInput.constructor)
{
var arrMatches = /function ([0-9a-z_]+)/i.exec(oInput.constructor.toString())
switch (arrMatches[1].toLowerCase())
{
case "number" :
if (Math.round(oInput) == oInput)
{
return 'i:' + oInput + ';'; //integer
}
else
{
return 'd:' + oInput + ';'; //float
}
break;
case "string" :
/*
oInput=oInput.replace(/\\/g, "\\\\")
oInput=oInput.replace(/\"/g, "\\\"")
oInput=oInput.replace(/\n/g, "\\n")
oInput=oInput.replace(/\r/g, "")
*/
return 's:'+oInput.length+':"'+oInput+'";';
break;
case "boolean" :
return (oInput == true) ? 'b:1;' : 'b:0;';
break;
case "function" :
return 'N;'; //returns a Null variable for functions
break;
case "array" :
var s = 'a:'+oInput.length+':{';
for (var i=0; i<oInput.length; i++)
{
s += 'i:'+i+';'+serialize(oInput[i]);
}
s += '}';
return s
break;
case "object" :
var o=oInput
if (o==null || typeof(o)=='undefined' || (o + '')==undefined) return 'N;';
var s='';
var count=0;
for (var item in o)
{
count++;
{
bolSerialized = false;
if (arrSerialized[item])
{
for (var i=0; i<arrSerialized[item].length && !bolSerialized; i++)
{
bolSerialized = (arrSerialized[item][i] === o[item]);
}
if (bolSerialized)
{
s +='N;';
}
else
{
arrSerialized[item][arrSerialized[item].length] = o[item];
}
}
else
{
arrSerialized[item] = [o[item]];
}
if (o[item] !== o && !bolSerialized)
{
_currentRecursionLevel++;
s += 's:'+item.length+':"'+item+'";' + serialize(o[item]);
_currentRecursionLevel--;
}
}
}
s = 'a:'+count+':{'+s+'}';
return s
break;
}
return '';
}
}
function print_js(_MyArray)
{
var _str="";
_str += isNaN(_MyArray.length) ? "{" : "[";
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
for (var j in _MyArray)
{
switch (typeof(_MyArray[j]))
{
case "number":
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
if (isNaN(_MyArray.length))
{
_str += "'"+j+"':"+_MyArray[j];
}
else
{
_str += _MyArray[j];
}
} break;
case "string":
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
if (isNaN(_MyArray.length))
{
_str += "'"+j+"':'"+_MyArray[j]+"'";
}
else
{
_str += "'"+_MyArray[j]+"'";
}
} break;
case "object":
{
if (isNaN(_MyArray.length))
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
_str += "'"+j+"':";
}
else
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
}
_str += print_js(_MyArray[j]);
} break;
}
}
_str += isNaN(_MyArray.length) ? "}" : "]";
return _str;
}
</script>
Функции не мои, но вроде работают правильно. Только вот unserialize нету. Но если нужно, можно по аналогии написать. |
|
|
Дмитрий Б. |
Отправлено: 14 Октября, 2005 - 06:10:07
|
Super Member
Покинул форум
Сообщений всего: 800
Дата рег-ции: Март 2005
Откуда: Иркутск
Карма 0
|
CODE:String.prototype.change=function()
{
var i, s=this;
for (i=0; i<arguments.length; i+=2) s=s.split(arguments[i]).join(arguments[i+1]);
return s;
}
String.prototype.toJSFormat=function()
{
return '"'+this.change('\\', '\\\\', '\'', '\\\'', '"', '\"', '\n', '\\n', '\r', '\\r', '\t', '\\t')+'"';
}
function arrayToString(n, l)
{
var name, value, x=n+'=new Array();';
for (name in l)
{
value=l[name];
switch(typeof(value))
{
case 'number': case 'boolean':
x+=n+'['+name.toJSFormat()+']='+value+';';
break;
case 'string':
x+=n+'['+name.toJSFormat()+']='+value.toJSFormat()+';';
break;
default:
if (value instanceof Array)
x+=arrayToString(n+'['+name.toJSFormat()+']', value);
else return null;
}
}
return x;
} |
|
|
|
Поиск в теме | Версия для печати |
Страниц (5): [1] 2 3 4 5 » |
Сейчас эту тему просматривают: 6 (гостей: 6, зарегистрированных: 0, скрытых: 0) |
« JavaScript » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|