Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#24 used as offset, casting to integer (24) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#27 used as offset, casting to integer (27) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: превращение массива в строку и обратно [3]
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (5): « 1 2 [3] 4 5 » 

> Без описания
Леголегс Администратор
Отправлено: 09 Января, 2006 - 16:15:45
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




kr12
Поднимем тему Улыбка Мне тут вдруг понадобилось кое-чево сериализовать. Скачал этот скрипт но почему-то под Windows Script Host он не заработал. Да и не очень хотелось Улыбка Своё всегда интереснее писать. Написал. Весьма небольшая в вместе с тем универсальная функция. Привожу вместе с примером
CODE:
function serialize(value)
{
var NL = "\r\n", TAB = "\t", out = new Array(), facttype;
if (value instanceof Array) facttype = "array";
else if (value instanceof RegExp) facttype = "regexp";
else if (value instanceof Function) facttype = "function";
else if (value instanceof Object) facttype = "object";
else facttype = typeof(value);
switch(facttype)
{
case "object":
for (var i in value)
out.push(serialize(i) + ": " + serialize(value[i]));
return "{"+(NL+out.join(","+NL)).replace(/\n/g,"\n"+TAB)+NL+"}";
case "array":
for (var i=0;i<value.length;i++)
out.push(serialize(value[i]));
return "["+(NL+out.join(","+NL)).replace(/\n/g,"\n"+TAB)+NL+"]";
case "string":
var r1 = [/\t/g, /\r/g, /\n/g, /"/g, /\\/g ];
var r2 = ["\\t", "\\r", "\\n", "\\\"","\\\\"];
while (r1.length) value = value.replace(r1.pop(),r2.pop());
return '"' + value +'"';
default:
return value.toString().replace(/\n/g,"\n"+TAB);
}
}

var test = {
adin: false,
dva: [3,2,1,6,7],
tri: {imya: "vasia", familiya: "pupkin"},
chetire: /(.+)/,
piat: function (d) { return d/2; },
bIbIbI: "\\djt \"yj\" yjy \
gh\n_ drt j\n\
"
};

eval("var clon="+serialize(test));
WScript.echo("test = " + serialize(test) + ";\n\
//===========================\n\
clon = " + serialize(clon) + ";");
 
 Top
Павел
Отправлено: 10 Января, 2006 - 02:39:59
Post Id



Junior Member


Покинул форум
Сообщений всего: 71
Дата рег-ции: Июль 2005  
Откуда: Санкт-Петербург

Карма 0




CODE:
function object2string(obj) {
var val, output = "";
if (obj) {
output += "{";
for (var i in obj) {
val = obj[i];
switch (typeof val) {
case ("object"):
if (val[0]) {
output += i + ":" + array2string(val) + ",";
} else {
output += i + ":" + object2string(val) + ",";
}
break;
case ("string"):
output += i + ":'" + escape(val) + "',";
break;
default:
output += i + ":" + val + ",";
}
}
output = output.substring(0, output.length-1) + "}";
}
return output;
}

function array2string(array) {
var output = "";
if (array) {
output += "[";
for (var i in array) {
val = array[i];
switch (typeof val) {
case ("object"):
if (val[0]) {
output += array2string(val) + ",";
} else {
output += object2string(val) + ",";
}
break;
case ("string"):
output += ":'" + escape(val) + "',";
break;
default:
output += val + ",";
}
}
output = output.substring(0, output.length-1) + "]";
}
return output
}

function string2array(string) {
eval("var result = " + string);
return result;
}

function string2object(string) {
eval("var result = " + string);
return result;
}


Вот так изящно... Особенно мне нравится из строки в массив/объект, где на самом деле можно одну функцию сделать
 
 Top
Леголегс Администратор
Отправлено: 10 Января, 2006 - 07:48:53
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




Павел
eval отэскейпенные строки неправильно обрабатывает. И регулярные выражения твой скрипт не обрабатывает Язычок. А ещё моя функция красиво табы расставляет!
Объявляю микроконкурс: кто решит ту-же задачу меньшим кодом тот хм... придумаем приз Улыбка
 
 Top
kr12
Отправлено: 14 Января, 2006 - 11:27:18
Post Id


Member


Покинул форум
Сообщений всего: 136
Дата рег-ции: Март 2005  

Карма 0




Товарищи! Вы проигнорировали существование ассоциативных елементов в массивах.
2 Леголегс :
WScript.echo - это немного не из этой оперы :)
 
 Top
Леголегс Администратор
Отправлено: 14 Января, 2006 - 17:31:03
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




kr12 пишет:
Вы проигнорировали существование ассоциативных елементов в массивах
Всё не предусмотришь. Кроме того лично я массивы использую как массивы а объекты как ассоциативные массивы. Так жить легче.
kr12 пишет:
WScript.echo - это немного не из этой оперы Улыбка
Да, Опера это не поддерживает Улыбка Просто я это писал под Windows Script Host (т.е. запускал js файл двойным кликом, без браузера), а там это аналог алерта.
 
 Top
kr12
Отправлено: 15 Января, 2006 - 04:53:58
Post Id


Member


Покинул форум
Сообщений всего: 136
Дата рег-ции: Март 2005  

Карма 0




Предлагаю, функцию, которую привел Леголегс, дополнить моей функцией по сохранению массивов. В ней не доделано распознавание сохраненных данных. Но если как то рекурсивно завернуть getElPos(), то будут читаться и многомерные ассоциативные массивы
 
 Top
kr12
Отправлено: 12 Мая, 2006 - 04:11:33
Post Id


Member


Покинул форум
Сообщений всего: 136
Дата рег-ции: Март 2005  

Карма 0




kr12 (Отправлено: 15 Января, 2006 - 12:53:58) предлагал:
Цитата:

как то рекурсивно завернуть getElPos(), то будут читаться и многомерные ассоциативные массивы

На данный момент ниасилил Недовольство, огорчение В конце концов можно обойтись и без ассоциативных массивов.
Но тут возникла более серьезная проблемма:
CODE:

function o1(){
this.o2=new o2(this);
}
function o2(parent){ // получаем ссылку на родительский объект
this.parent=parent||0
}
o1_1=new o1()
WScript.echo(serialize(o1_1))

Функция которую написал Леголегс (Отправлено: 10 Января, 2006 - 00:15:45) не видит разницы между объектом и переменной, содержащей ссылку на объект. Врезультате "Stack overflow". Есть варианты? Я могу предложить лишь в называния переменных со ссылками добавлять некий символ и так различать их.
 
 Top
Дмитрий Б.
Отправлено: 12 Мая, 2006 - 08:21:40
Post Id



Super Member


Покинул форум
Сообщений всего: 800
Дата рег-ции: Март 2005  
Откуда: Иркутск

Карма 0




kr12
Вообще, на мой взгляд, имя класса, пусть даже такого суррогатного, как в JS, - святыня, и посягаться на неё не следует. В JS названия классов обычно начинаются с большой буквы, тогда как имена объектов (например, встроенных) - с маленькой; почему бы не последовать этой замечательной традиции?..
 
 Top
Леголегс Администратор
Отправлено: 12 Мая, 2006 - 10:28:31
Post Id



JS-маньяк


Покинул форум
Сообщений всего: 2109
Дата рег-ции: Июль 2004  
Откуда: Липецк

Карма 17




kr12 пишет:
видит разницы между объектом и переменной, содержащей ссылку на объект
Нет никакой разницы. Точнее нет ничего, кроме ссылок.Но ты прав, есть такая проблема. Я это заметил, когда document пытался отпечатать. Решил так: вёл список ссылок, которые уже отработаны и повторно их не обрабатывал (плохое решение, я знаю).
 
 Top
Дмитрий Б.
Отправлено: 13 Мая, 2006 - 01:29:44
Post Id



Super Member


Покинул форум
Сообщений всего: 800
Дата рег-ции: Март 2005  
Откуда: Иркутск

Карма 0




Леголегс
Ах вот вы о чём!
Можно ещё к каждому объекту флаг processed добавлять, но это уже извращение... На C++ такого бы не было!
 
 Top
Страниц (5): « 1 2 [3] 4 5 »
Сейчас эту тему просматривают: 2 (гостей: 2, зарегистрированных: 0, скрытых: 0)
« JavaScript »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0449]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33