- 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);
}
а так в лоб два уровня - проще и элегантнее не придумаешь.
А у меня все нормально.
Количество строк кода такое же, как в вышеупомянутом ГК, масштабируемо как по глубине, так и по возможности заменить разделитель строк, никакой вечной рекурсии и грязных хаков.
пример:
вывод:
я в прошлом страдал тем что делал аналог перлового Data::Dumper. правда там у меня все объекты были одинакового "типа" и имели ключевое поле - проблем с их сравнением не было.
пример желаемого вывода:
http://ru-swine.livejournal.com/292495.html
ага :)
P.S. С JS у меня плохо, не смейтесь над кодом, писал как мог ;)
P.P.S. Из-за линейных поисков производительность должна быть отвратной O(n^2), но в js походу иначе никак.
хах
P.S. Такой метод достоен отдельного говнокода? ;)
http://stackoverflow.com/q/500504/484666
> 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
http://ideone.com/xlE78Q
НО: хахаха. хахаха. облом. перлового Data::Dumper в жаба скрипте не получится.
попробовал это заэвалить.
в `var zzz = { 'a': zzz }`, второе zzz все еще `undefined` потому что значение еще не присвоено.
аблом. :(
ЗЫ но все равно круто. потому что читабельно.
Если сериализатор - можно попробовать не выводить ссылки на руты, а затем еще разок пробежаться по иерархии и догенерить присваивания.
P.S. Блджад, запятые забыл.
Теперь вполне исполняемый код. Нет только экранирования строк, но это тривиально и совсем влом реализовывать.
Создаем два массива objects и roots. objects пустой, в roots пока лежит самый первый объект.
На первом этапе сканируем объекты и вносим их в массив objects, а если объект уже там есть - то и в массив roots.
На втором этапе выводим каждый root по-отдельности, подписав перед ним что-то типа var x1 =, а когда в поле какого-нибудь объекта попадается ссылка на что-то лежащее в roots, вместо нее проставляем x1.
Если я не туплю - такой алгоритм должен нормально вывести произвольный граф, правда не особо шустро, т.к. в js нету нормального ассоциативного массива, но для отладки сойдет.
Уголовно наказуемо же.
Помни, RaZeR, за тобой могут следить!
Когда-то пробовал написать сериализатор, зачем-то. Но так никогда им не пользовался. Сейчас подправил немножко, но тестировть все равно влом.
Да, и все равно есть жабоскриптовские сущности, которые нельзя сериализовать, те же замыкания. Но об этом еще Стив Еге писал. Да, и это писалось для ноды, в ИЕ, скорее всего то, что касается функций не сработает. Да и вообще, как я уже говорил, это только идея, я так этим никогда и не пользовался.