function print_r( array, return_val ) { // Prints human-readable information about a variable
//
// + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// + namespaced by: Michael White (http://crestidg.com)
var output = "", pad_char = " ", pad_val = 4;
var formatArray = function (obj, cur_depth, pad_val, pad_char) {
if(cur_depth > 0)
cur_depth++;
var base_pad = repeat_char(pad_val*cur_depth, pad_char);
var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
var str = "";
if(obj instanceof Array) {
str += "Array\n" + base_pad + "(\n";
for(var key in obj) {
if(obj[key] instanceof Array) {
str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char);
} else {
str += thick_pad + "["+key+"] => " + obj[key] + "\n";
}
}
str += base_pad + ")\n";
} else {
str = obj.toString(); // They didn't pass in an array.... why? -- Do the best we can to output this object.
};
return str;
};
var repeat_char = function (len, char) {
var str = "";
for(var i=0; i < len; i++) { str += char; };
return str;
};
output = formatArray(array, 0, pad_val, pad_char);
if(return_val !== true) {
document.write("<pre>" + output + "</pre>");
return true;
} else {
return output;
}
}
Не совсем понятно условие в коде
if(obj instanceof Array)
в строке 16 и 19. Это препятствует распечатке хэшей (ну и других объектов), а только массивов.
Например
print_r(
{
name: "Sirius",
sex : "male"
},
false
);
напечатает просто [object Object], что ставит под сомнение полезность данной реализации.
Я бы заменил бы первое условие на
if(obj instanceof Array || obj instanceof Object) {
А второе на
if(obj[key] instanceof Array || obj[key] instanceof Object) {
что позволяет распечатывать хэши да и впринципе все объекты, что порой очень полезно при отладке
Мой вариант (не заметил что страницы еще есть кроме первой, вот и написал сам):
var print_r = function(variable, deep, index) { if (variable===undefined) {alert('undefined'); return false;} if (deep===undefined) {var deep = 0;} if (index===undefined) {var index = '';} else {index+=': ';} var mes = ''; var i = 0; var pre = '\n'; while (i<deep) {pre+='\t'; i++;} if (typeof(variable)=='object') { mes+=pre+index+' {'; for (index in variable) { mes+=print_r(variable[index], (deep+1), index); } mes+=pre+'}'; } else { mes+=pre+index+variable; } if (deep) {return mes;} else {alert(mes);} }очень плохо написано
напечатаете какой-нить элемент из дома и повиснет все. там же есть рекурсивный "all"
а еще не каждое свойство можно получить. нужно так писать тогда так:
try{
print_r(..);
} catch(..) {
console.log(..);
}
А так?
print_r = function(variable, deep, index) { // temporary utils if (variable===null) {var variable = 'null';} if (deep===undefined) {var deep = 0;} if (index===undefined) {var index = '';} else {index+=': ';} var mes = ''; var i = 0; var pre = '\n'; while (i<deep) {pre+='\t'; i++;} if (variable && variable.nodeType!=undefined) { mes+=pre+index+'DOM node'+((variable.nodeType==1)? (' <'+variable.tagName+'>'): ''); } else if (typeof(variable)=='object') { mes+=pre+index+' {'; for (index in variable) { mes+=print_r(variable[index], (deep+1), index); } mes+=pre+'}'; } else { mes+=pre+index+variable; } if (deep) {return mes;} else {alert(mes);} }Классная вещь, спасибо, работает отлично, лучше чем вариант в статье!
а я юзаю
console.log(obj)
в консоли фаербага оно отображается как дерево
Пользуюсь такой функцией (спасибо http://www.openjs.com/scripts/others/dump_function_php_print_r.php)
function pre(arr,level) { var dumped_text = ""; if(!level) level = 0; //The padding given at the beginning of the line. var level_padding = ""; for(var j=0;j<level+1;j++) level_padding += " "; if(typeof(arr) == 'object') { //Array/Hashes/Objects for(var item in arr) { var value = arr[item]; if(typeof(value) == 'object') { //If it is an array, dumped_text += level_padding + "'" + item + "' ...\n"; dumped_text += dump(value,level+1); } else { dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n"; } } } else { //Stings/Chars/Numbers etc. dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; } return alert(dumped_text); }В данном принт_р есть проблемы если в массиве есть функции, и если обьект является одновременно и обьектом и функцией или текстом, вот моя версия без этих проблем...
function print_r( array, return_val ) { var output = "", pad_char = " ", pad_val = 4; var formatArray = function (obj, cur_depth, pad_val, pad_char) { if(cur_depth > 0) cur_depth++; var base_pad = repeat_char(pad_val*cur_depth, pad_char); var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char); var str = ""; if(typeof obj=='object' || typeof obj=='array' || (obj.length>0 && typeof obj!='string' && typeof obj!='number')) { if(!(typeof obj=='object' || typeof obj=='array'))str = '\n'+obj.toString()+'\n'; str += '[\n';//"Array\n" + base_pad + "(\n"; for(var key in obj) { if(typeof obj[key]=='object' || typeof obj[key]=='array' || (obj.length>0 && typeof obj!='string' && typeof obj!='number')) { str += thick_pad + ""+key+": "+((!(typeof obj=='object' || typeof obj=='array'))?'\n'+obj[key]+'\n':'')+formatArray(obj[key], cur_depth+1, pad_val, pad_char)+'\n'; } else { str += thick_pad + ""+key+": " + obj[key] + "\n"; } } str += base_pad + "]\n"; } else { str = obj.toString(); }; return str; }; var repeat_char = function (len, char) { var str = ""; for(var i=0; i < len; i++) { str += char; }; return str; return str; }; output = formatArray(array, 0, pad_val, pad_char); return output; }