Тема: JScript: Вывод свойств и значений массива или объекта - дополнение
Upd. Последнюю версию, довольно далеко ушедшую от этой, смотрим в последних постах данной темы
Хочу поделиться вариантом в дополнение к теме http://forum.script-coding.com/viewtopic.php?id=3961
Версия с WScript.Echo(). НЕ рекомендуется использовать с wscript.exe!
//Рекурсивное описание содержимого объекта obj через WScript.Echo()
//obj - исследуемый объект
//padding - начальный отступ, в padding_char единицах (padding_char=" ")
//parent_name - имя объекта (произвольное, по сути комментарий)
//Использование: vardump(myObj, 2, "Объект №5");
//Можно проще: vardump(myObj);
function vardump(obj, padding, parent_name)
{
if (typeof(padding) == "undefined") //Определяем, если не определено (опущено при вызове)
padding = 0; //Отступ
if (typeof(parent_name) == "undefined")
parent_name = ""; //Имя родителя
var no_space_for_first = (parent_name == "") ? "" : " "; //Чтобы у корневого (безымянного) объекта не было пробела перед типом
var padding_char = " ";
var pre_string = "";
for (var i=0; i<padding; i++) //Набираем отступ
pre_string += padding_char;
WScript.Echo(pre_string + parent_name + no_space_for_first +"(" + typeof(obj) + ")=>" + obj + "<"); //Выводим имя (тип)=>значение<
if (typeof(obj) == "object")
{
for (var child in obj)
{
var child_name = parent_name; //Делаем имя потомку
if (child_name != "")
child_name += ".";
child_name += child;
arguments.callee(obj[child], padding+1, child_name);
}
}
} //vardump
Универсальный вариант, возвращающий все одной string
//Возвращает string: рекурсивное описание содержимого объекта obj
function svd(obj, padding, parent_name)
{
if (typeof(padding) == "undefined") //Определяем, если не определено (опущено при вызове)
padding = 0; //Отступ
if (typeof(parent_name) == "undefined")
parent_name = ""; //Имя родителя
var no_space_for_first = (parent_name == "") ? "" : " "; //Чтобы у корневого (безымянного) объекта не было пробела перед типом
var padding_char = " ";
var pre_string = "";
for (var i=0; i<padding; i++) //Набираем отступ
pre_string += padding_char;
var result = pre_string + parent_name + no_space_for_first +"(" + typeof(obj) + ")=>" + obj + "<\n"; //Выводим имя (тип)=>значение<
if (typeof(obj) == "object")
for (var child in obj)
{
var child_name = parent_name; //Делаем имя потомку
if (child_name != "")
child_name += ".";
child_name += child;
result += arguments.callee(obj[child], padding+1, child_name);
}
return(result);
} //svd
Отличия:
* выделение степени вложенности
* указание типов
* указание границ значений (значками ">" и "<"), кому не надо - стереть не составит труда
Упомянутый в источнике объект vardump(myArr) выводит следующим образом:
(object)=>string,function(){return a+b},[object Object],98,str,function(){x++},[object Object]<
0 (string)=>string<
1 (function)=>function(){return a+b}<
2 (object)=>[object Object]<
2.a (number)=>32<
2.b (string)=>v4<
2.c (object)=>1,a<
2.c.0 (number)=>1<
2.c.1 (string)=>a<
3 (object)=>98,str,function(){x++},[object Object]<
3.0 (number)=>98<
3.1 (string)=>str<
3.2 (function)=>function(){x++}<
3.3 (object)=>[object Object]<
3.3.prop (string)=>value<
для сравнения, вывод оригинала:
['0'] = string
['1'] = function(){return a+b}
['2']['a'] = 32
['2']['b'] = v4
['2']['c']['0'] = 1
['2']['c']['1'] = a
['3']['0'] = 98
['3']['1'] = str
['3']['2'] = function(){x++}
['3']['3']['prop'] = value