- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
function alertObj(obj) {
var str = "";
for(k in obj) {
if (typeof obj[k] == "object") {
str += k+":<br />";
for(kk in obj[k]) {
if (typeof obj[k][kk] == "object") {
str += "--"+kk+":<br />";
for(kkk in obj[k][kk]) {
str += "----"+kkk+": "+ obj[k][kk][kkk]+"<br />";
}
} else {
str += "--"+kk+": "+ obj[k][kk]+"<br />";
}
}
} else {
str += k+": "+ obj[k]+"<br />";
}
}
alert(str);
}
mangyst 22.02.2013 13:21 # −1
Dummy00001 22.02.2013 14:56 # +1
а так в лоб два уровня - проще и элегантнее не придумаешь.
mangyst 22.02.2013 16:20 # 0
scriptin 22.02.2013 18:41 # 0
А у меня все нормально.
Количество строк кода такое же, как в вышеупомянутом ГК, масштабируемо как по глубине, так и по возможности заменить разделитель строк, никакой вечной рекурсии и грязных хаков.
Dummy00001 22.02.2013 19:09 # +1
пример:
вывод:
я в прошлом страдал тем что делал аналог перлового Data::Dumper. правда там у меня все объекты были одинакового "типа" и имели ключевое поле - проблем с их сравнением не было.
пример желаемого вывода:
scriptin 22.02.2013 19:33 # +3
http://ru-swine.livejournal.com/292495.html
Dummy00001 22.02.2013 20:07 # 0
ага :)
bormand 22.02.2013 20:34 # +1
P.S. С JS у меня плохо, не смейтесь над кодом, писал как мог ;)
P.P.S. Из-за линейных поисков производительность должна быть отвратной O(n^2), но в js походу иначе никак.
guest 22.02.2013 20:42 # +1
хах
bormand 22.02.2013 20:43 # 0
P.S. Такой метод достоен отдельного говнокода? ;)
guest 22.02.2013 20:45 # +1
scriptin 22.02.2013 20:59 # 0
http://stackoverflow.com/q/500504/484666
guest 22.02.2013 22:02 # 0
scriptin 22.02.2013 22:06 # 0
> console.log(a.constructor == Array, Object.prototype.toString.call(a) == '[object Array]');
true true
> a.constructor = {};
> console.log(a.constructor == Array, Object.prototype.toString.call(a) == '[object Array]');
false true
guest 22.02.2013 22:18 # +3
scriptin 22.02.2013 22:42 # 0
guest 23.02.2013 04:25 # 0
http://ideone.com/xlE78Q
Dummy00001 22.02.2013 20:43 # 0
НО: хахаха. хахаха. облом. перлового Data::Dumper в жаба скрипте не получится.
попробовал это заэвалить.
в `var zzz = { 'a': zzz }`, второе zzz все еще `undefined` потому что значение еще не присвоено.
аблом. :(
ЗЫ но все равно круто. потому что читабельно.
bormand 22.02.2013 20:47 # 0
Если сериализатор - можно попробовать не выводить ссылки на руты, а затем еще разок пробежаться по иерархии и догенерить присваивания.
bormand 22.02.2013 20:54 # 0
P.S. Блджад, запятые забыл.
bormand 22.02.2013 21:05 # 0
Теперь вполне исполняемый код. Нет только экранирования строк, но это тривиально и совсем влом реализовывать.
bormand 22.02.2013 19:45 # 0
Создаем два массива objects и roots. objects пустой, в roots пока лежит самый первый объект.
На первом этапе сканируем объекты и вносим их в массив objects, а если объект уже там есть - то и в массив roots.
На втором этапе выводим каждый root по-отдельности, подписав перед ним что-то типа var x1 =, а когда в поле какого-нибудь объекта попадается ссылка на что-то лежащее в roots, вместо нее проставляем x1.
Если я не туплю - такой алгоритм должен нормально вывести произвольный граф, правда не особо шустро, т.к. в js нету нормального ассоциативного массива, но для отладки сойдет.
wvxvw 22.02.2013 21:44 # 0
wvxvw 22.02.2013 21:40 # −1
guest 23.02.2013 04:26 # +1
wvxvw 23.02.2013 05:34 # 0
RaZeR 22.02.2013 13:51 # +1
Уголовно наказуемо же.
Помни, RaZeR, за тобой могут следить!
wvxvw 23.02.2013 13:02 # 0
Когда-то пробовал написать сериализатор, зачем-то. Но так никогда им не пользовался. Сейчас подправил немножко, но тестировть все равно влом.
Да, и все равно есть жабоскриптовские сущности, которые нельзя сериализовать, те же замыкания. Но об этом еще Стив Еге писал. Да, и это писалось для ноды, в ИЕ, скорее всего то, что касается функций не сработает. Да и вообще, как я уже говорил, это только идея, я так этим никогда и не пользовался.