dump() - Javascript equivalent of PHP's print_r() function

The moment I saw the print_r() function of PHP, I fell in love with it. It is a very necessary function and I cannot understand why no other language supports it. JavaScript is one such language. So, I have ported the print_r function to javascript.

/**
 * Function : dump()
 * Arguments: The data - array,hash(associative array),object
 *    The level - OPTIONAL
 * Returns  : The textual representation of the array.
 * This function was inspired by the print_r function of PHP.
 * This will accept some data as the argument and return a
 * text that will be a more readable version of the
 * array/hash/object that is given.
 * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
 */
function dump(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 dumped_text;
}

This is how the function is called. In this example we will give a complex array as the argument.

//Calling the function...
function init() {
	var arra = new Array("So long",'s',42,42.13,"Hello World");
	var assoc = {
		"val"  : "New",
		"number" : 8,
		"theting" : arra
	};
	
	alert(dump(assoc));
}
window.onload=init;

The result will be returned in the following format...

'val' => "New"
'number' => "8"
'theting' ...
   '0' => "So long"
   '1' => "s"
   '2' => "42"
   '3' => "42.13"
   '4' => "Hello World"

You can alert the returned text - if it is small. If there is a large amount of content, put the data into a textarea. This will make reading easier.

Original Post

Comments

Anonymous at 24 Apr, 2007 07:06
very nice.
Reply to this.
Kritical at 15 May, 2007 08:17
This function gives me the following output

too much recursion
[Break on this error] dumped_text += dump(value,level+1);

I'm assuming because it's dealing with nested objects?
Reply to this.
Binny V A at 15 May, 2007 09:09
If you try to dump a DOM node, it will result in the 'too much recursion' error. Use this function only for arrays.
Reply to this.
A Sohn at 20 Mar, 2008 01:00

function str_repeat(str, repeat) {
var output = '';
for (var i = 0; i < repeat; i++) {
output += str;
}
return output;
}
var MAX_DEPTH = 10;
function print_r(obj, indent, depth) {
var ws = ' ';
var output = '';
indent = (!indent) ? 0 : indent;
depth = (!depth) ? 0 : depth;
if (depth > MAX_DEPTH) {
return str_repeat(ws, indent) + '*Maximum Depth Reached*\n';
}
if (typeof(obj) == "object") {
output += (indent == 0) ? typeof(obj) + '\n(\n' : '';
indent++;
var child = '';
for (var key in obj) {
try {
child = obj[key];
}
catch (e) {
child = '*Unable To Evaluate*';
}
output += str_repeat(ws, indent) + '['+key+'] => ';
if (typeof(child) == "object") {
indent++;
output += typeof(child) + '\n';
output += str_repeat(ws, indent) + '(\n';
output += print_r(child, indent, depth+1);
output += str_repeat(ws, indent) + ')\n';
indent--;
}
else {
output += child + '\n';
}
}
indent--;
output += (indent == 0) ? ')\n' : '';
return output;
}
else {
return str_repeat(ws, indent) + obj + '\n';
}
}
Reply to this.
Anonymous at 23 Oct, 2007 04:54
Someone please make a dump function that handles recursion, by defining a maxdepth... I'm working on one, no luck yet though :-(
So often this comes in handy when dealing with complex event handling.

Anders
Reply to this.
J Walker at 16 Nov, 2007 04:59
Many thanks man!
Reply to this.
Anonymous at 27 Mar, 2008 03:21
How about using JSON? Would be much more handy, since it's native to javascript.
Reply to this.
Anonymous at 06 Jan, 2009 01:36
Thank you for mentioning JSON. I realized I already have a function that will work for this at your mention, through Spry.Utils.serializeObject.
Reply to this.
Anonymous at 14 May, 2008 11:33
Many thanks man!
Reply to this.
Martijn at 20 Oct, 2008 06:26
Sadly it's not for objects....

For objects and arrays i found one here:

remorse.nl/weblog/javascript_debugging_print_rvar_dump_in_javascript_like_php/
Reply to this.
Anonymous at 22 Oct, 2008 05:59
Great stuff!
Reply to this.
picard at 11 Jan, 2009 01:28
Here's a version of the same thing that's cleaner and easier to understand: scriptnode.com/article/javascript-print_r-or-var_dump-equivalent/
Reply to this.
Anonymous at 29 Jan, 2009 07:41
why don't you called the function print_r =D
Reply to this.
randomguy at 28 Apr, 2009 01:23
You just saved me a lot of time troubleshooting. As soon as I could see the data in the array, my problem was instantly clear and quickly fixed. Thankyou!
Reply to this.
Anonymous at 18 Aug, 2009 08:28
Nice, but very confusing if you use this on any array that's been extended with prototype.
Reply to this.
Anonymous at 22 Oct, 2009 06:48
why don't you called the function print_r =D
Reply to this.
michael at 07 Jan, 2010 10:11
Thanks for the post. Very helpful function for debugging!

"It is a very necessary function and I cannot understand why no other language supports it."
Just thought I'd point out that quite a few other languages support it. Python's str() and repr() functions can do that and a ton more (Python's built-in debugging features are superb, which is why I adore it). Also perl has some something like Data::Dumper, and ruby has logger.debug.

Anyway, nonetheless nice article.
Reply to this.
Comment

Please dont enter you comments in this form - this is a fake form to confuse spamming bots. The next form is the real one.




Comment




Comment Formating : HTML tags a, strong, em, b, i, code, pre, p and br allowed. Other tags will be shown as code(< will become &lt;). Urls, Line breaks will be auto-formated.